为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
哆啦的时光机 2021-07-15 14:15:20
我想弄清楚如何在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/)但我想知道是否有人知道更好的方法来做到这一点。我想知道其他人知道一种不那么乏味的方法来做到这一点。
查看完整描述

3 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

可能会迟到,但是当搜索相同的问题时,谷歌在高排名中报告此页面,所以:我的解决方案是定义特殊类型,例如附加 NullInt64 并具有并导出 JSON


NullInt64 示例:


// 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 properties

type NullInt64 struct {

    sql.NullInt64

}


// NullInt64 MarshalJSON interface redefinition

func (r NullInt64) MarshalJSON() ([]byte, error) {

    if r.Valid {

        return json.Marshal(r.Int64)

    } else {

        return json.Marshal(nil)

    }

}

然后将所有 sql.NullInt64 替换为 NullInt64。您可以轻松地对 sql.NullString 执行相同的操作。希望能帮助到你


查看完整回答
反对 回复 2021-07-19
?
临摹微笑

TA贡献1982条经验 获得超2个赞

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


查看完整回答
反对 回复 2021-07-19
?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

如果你真的想要空字段,你将不得不求助于自定义编组器(或者,也许,只是可能,*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 做什么:)


查看完整回答
反对 回复 2021-07-19
  • 3 回答
  • 0 关注
  • 256 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信