带有temptemp的元帅sql.NullString

带有temptemp的元帅sql.NullString

问题描述:

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

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
", 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.