Marshal sql.NullString with omitempty

sat*_*sat 4 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))
}
Run Code Online (Sandbox Code Playgroud)

One*_*One 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)
}
Run Code Online (Sandbox Code Playgroud)

指针与http://tip.golang.org/pkg/encoding/json/#Marshal有所不同的原因:

- 该字段为空,其标签指定"omitempty"选项.

空值为false,0,任何nil指针或接口值,以及长度为零的任何数组,切片,映射或字符串.

  • 我有同样的问题,使用指针并没有多大帮助。我使用 *sql.NullString 类型作为行扫描的接收器。指针值将通过扫描设置,因此 omitempty 失败并且 k/v 对仍然作为 k: null 填充到 JSON 中。防止 k/v 出现在 JSON 中的最佳解决方案是什么?在编组为 JSON 之前迭代结构中的字段,并在 Value() 方法返回 nil、nil 时将指针值设置为 nil? (3认同)