如果它无效,那么如何渲染null sql.NullString? - http://play.golang.org/p/pzSWS9vE0J
它似乎没有使用omitempty struct标签,我无法弄清楚从MarshalJSON返回什么,以便omitempty将被尊重
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))
}
答案 0 :(得分:6)
据我所知,没有办法做到这一点,但你可以随时使用指针: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)
}
指针与http://tip.golang.org/pkg/encoding/json/#Marshal产生差异的原因:
- 该字段为空,其标签指定" omitempty"选项。
空值为false,0,任何nil指针或接口值,以及长度为零的任何数组,切片,映射或字符串。