mbfrahry mbfrahry - 5 months ago 35
JSON Question

JSON golang boolean omitempty

I'm having issues with writing a golang library for an api. The json aspect of booleans is causing issues.

Let's say the default value of a boolean is true for an api call.

If I do

SomeValue bool `json:some_value,omitempty`


and I don't set the value through the library, the value will be set to true. If I set the value to false in the library, omitempty says that a false value is an empty value so the value will stay true through the api call.

Let's take out the omitempty and have it look like this

SomeValue bool `json:some_value`


Now I have the opposite issue, I can set the value to false but if I don't set the value then the value will be false even though I expect it to be true.

Edit: How do I maintain the behavior of not having to set the value to true while also being able to set the value to false?

g-v g-v
Answer

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

Output:

{}
{"some_value":true}
{"some_value":false}