2016-06-10 11 views
10

Mam problemy z pisaniem biblioteki golang dla api. Aspekt json z booleans powoduje problemy.JSON golang boolean omitempty

Załóżmy, że wartość domyślna wartości logicznej jest prawdziwa dla wywołania api.

Jeśli robię

SomeValue bool `json:some_value,omitempty` 

i nie ustawić wartość przez bibliotekę, wartość zostanie ustawiona na wartość true. Jeśli ustawię wartość false w bibliotece, omitempty mówi, że wartość false jest pustą wartością, więc wartość pozostanie prawdziwa przez wywołanie api.

Weźmy na zewnątrz omitempty i ma to wyglądać tak

SomeValue bool `json:some_value` 

Teraz mam odwrotny problem, mogę ustawić wartość false, ale jeśli nie zostanie ustawiona wartość to wartość będzie Fałszywe, chociaż spodziewam się, że to prawda.

Edycja: Jak zachować zachowanie polegające na nieprowadzeniu do wartości true, a jednocześnie można ustawić wartość na false?

+0

Czekaj, tak, to jest pytanie? – Jerrybibo

+3

, kiedy musisz rozróżnić wartości nieustawione i zero, użyj wskaźnika. – JimB

+0

Dodałem pytanie. Daj mi znać, jeśli to ma sens @Jerrybibo – mbfrahry

Odpowiedz

11

Use pointers

package main 

import (
    "encoding/json" 
    "fmt" 
) 

type SomeStruct struct { 
    SomeValue *bool `json:"some_value,omitempty"` 
} 

func main() { 
    t := new(bool) 
    f := new(bool) 

    *t = true 
    *f = false 

    s1, _ := json.Marshal(SomeStruct{nil}) 
    s2, _ := json.Marshal(SomeStruct{t}) 
    s3, _ := json.Marshal(SomeStruct{f}) 

    fmt.Println(string(s1)) 
    fmt.Println(string(s2)) 
    fmt.Println(string(s3)) 
} 

wyjściowa:

{} 
{"some_value":true} 
{"some_value":false} 
+0

To się udało! Dzięki – mbfrahry