使用omitempty来编组sql.NullString。

huangapple go评论91阅读模式
英文:

Marshal sql.NullString with omitempty

问题

如何在不有效时不渲染空的 sql.NullString?- http://play.golang.org/p/pzSWS9vE0J

似乎在使用 omitempty 结构标签时不起作用,我无法弄清楚从 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))
}

以上是你提供的代码。

英文:

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

答案1

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

英文:

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.

huangapple
  • 本文由 发表于 2014年6月22日 04:30:18
  • 转载请务必保留本文链接:https://go.coder-hub.com/24345621.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定