Marshal sql.NullString with omitempty

时间:2014-06-21 20:30:19

标签: go

如果它无效,那么如何渲染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))
}

1 个答案:

答案 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指针或接口值,以及长度为零的任何数组,切片,映射或字符串。