Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JSON golang boolean omitempty

Tags:

json

go

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?

like image 765
mbfrahry Avatar asked Jun 10 '16 19:06

mbfrahry


1 Answers

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}
like image 170
gavv Avatar answered Oct 15 '22 17:10

gavv