2016-06-10 31 views
10

Sto riscontrando problemi con la scrittura di una libreria golang per un'API. L'aspetto json dei booleani sta causando problemi.JSON golang boolean omitempty

Supponiamo che il valore predefinito di un valore booleano sia vero per una chiamata API.

Se faccio

SomeValue bool `json:some_value,omitempty` 

e non imposto il valore attraverso la biblioteca, il valore verrà impostato su true. Se imposto il valore su false nella libreria, omitempty dice che un valore falso è un valore vuoto, quindi il valore rimarrà true attraverso la chiamata api.

Prendiamo l'omitempty e farlo apparire come questo

SomeValue bool `json:some_value` 

Ora ho il problema opposto, posso impostare il valore a false, ma se non si imposta il valore di allora il valore sarà falso anche se mi aspetto che sia vero.

Modifica: come si mantiene il comportamento di non dover impostare il valore su true pur essendo in grado di impostare il valore su false?

+0

Attendere, quindi, qual è la domanda? – Jerrybibo

+3

quando è necessario distinguere tra valori non impostati e zero, utilizzare un puntatore. – JimB

+0

Ho aggiunto la domanda. Fammi sapere se questo ha senso @Jerrybibo – mbfrahry

risposta

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)) 
} 

uscita:

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

Questo l'ha fatto! Grazie – mbfrahry