猿问

JSON marshall 在数据库/sql Go 中可以为空类型值

我想弄清楚如何在Go 中正确地将可空类型(字符串、整数、时间)正确地编组为 JSON 。我知道database/sql提供sql.NullTime,sql.NullInt等等,但是当你编组这些值时,你会得到类似的东西


{"first_name": {

  "Value": "",

  "Valid": false,

}}

我真正想要的是


{"first_name": null}

我知道你可以实现你自己的 MarshalJSON 来做到这一点(我在这里写过它http://dennissuratna.com/marshalling-nullable-string-db-value-to-json-in-go/)


但我想知道是否有人知道更好的方法来做到这一点。我想知道其他人知道一种不那么乏味的方法来做到这一点。


哆啦的时光机
浏览 257回答 3
3回答

慕村225694

可能会迟到,但是当搜索相同的问题时,谷歌在高排名中报告此页面,所以:我的解决方案是定义特殊类型,例如附加 NullInt64 并具有并导出 JSONNullInt64 示例:// NullInt64 is the same as sql.NullInt64// But when exported to JSON it is null or the int64 val that is exported// not a JSON containing Value and Valid propertiestype NullInt64 struct {    sql.NullInt64}// NullInt64 MarshalJSON interface redefinitionfunc (r NullInt64) MarshalJSON() ([]byte, error) {    if r.Valid {        return json.Marshal(r.Int64)    } else {        return json.Marshal(nil)    }}然后将所有 sql.NullInt64 替换为 NullInt64。您可以轻松地对 sql.NullString 执行相同的操作。希望能帮助到你

临摹微笑

创建一个嵌入(例如)sql.NullInt 并实现 json.Marshaler 接口的类型。

陪伴而非守候

如果你真的想要空字段,你将不得不求助于自定义编组器(或者,也许,只是可能,*string在结构中使用字段并分配nil而不是空字符串)。但是,如果您查看 JSON(JavaScript Object Notation)的原始目标,您会注意到在 JavaScript 中几乎没有任何区别:var obj = JSON.parse('{"first_name": null }');alert(obj.first_name)和:var obj = JSON.parse('{}');alert(obj.first_name)换句话说:分配null给一个字段与不指定它具有相同的效果。大多数 JSON 解析器都是这样工作的。Go JSON 编组器支持不指定空字段:type MyType struct {    firstname string `json:omitempty`}最后,这取决于你想用你的 JSON 做什么:)
随时随地看视频慕课网APP

相关分类

Go
我要回答