Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Marshal sql.NullString with omitempty

Tags:

go

How is one supposed to not render the null sql.NullString if it is not valid? - http://play.golang.org/p/pzSWS9vE0J

It doesn't seem to be working with omitempty struct tag and I can't quite figure out what to return from the MarshalJSON such that omitempty will be honored

type NS struct {
    sql.NullString
}

func (ns *NS) MarshalJSON() ([]byte, error) {
    fmt.Println("Marshaling json for NS")
    if ns.String == "" && !ns.Valid {
        return []byte("null"), nil
    }
    return json.Marshal(ns.String)
}

type A struct {
   RStr string `json:rstr,omitempty"`
   Str NS `json:"str,omitempty"`
}


func main() {
    a := A{RStr: "rstr"}
    s, _ := json.Marshal(&a)
    fmt.Println(string(s))
}
like image 251
sat Avatar asked Jun 21 '14 20:06

sat


1 Answers

As far as I know, there's no way to do that, however you can always use a pointer instead : http://play.golang.org/p/b4Q7YgpUa-

func main() {
    a := A{"rstr", &sql.NullString{"Test", true}}
    s, err := json.Marshal(&a)
    fmt.Println(string(s), err)
    a = A{}
    fmt.Println(json.Unmarshal(s, &a))
    fmt.Printf("%v %v\n", a.RStr, a.Str.String)
    a = A{RStr: "rstr"}
    s, err = json.Marshal(&a)
    fmt.Println(string(s), err)
}

The reason why a pointer makes a difference from http://tip.golang.org/pkg/encoding/json/#Marshal:

-the field is empty and its tag specifies the "omitempty" option.

The empty values are false, 0, any nil pointer or interface value, and any array, slice, map, or string of length zero.

like image 187
OneOfOne Avatar answered Nov 24 '22 12:11

OneOfOne