我试图弄清楚如何在Go中正确地将hsall可空类型(string,int,time)正确地marhsall到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条答案
按热度按时间pjngdqdw1#
可能是晚了,但当搜索同样的问题谷歌报告此页面在一个高排名,所以:我的解决方案是定义特殊类型,例如NullInt64,并导出JSON
NullInt64的例子:
然后将所有sql.NullInt64替换为NullInt64。您可以轻松地为sql.NullString执行相同的操作。希望能帮上忙
yrwegjxp2#
创建一个嵌入(例如)sql.NullInt并实现json.Marshaler接口的类型。
ioekq8ef3#
如果你真的想要空字段,你将不得不求助于一个自定义的编组器(或者,也许,只是也许,在结构中使用
*string
字段并分配nil
而不是空字符串)。然而,如果你看一下JSON(JavaScript对象表示法)的最初目标,你会注意到在JavaScript中,几乎没有任何区别:
以及:
换句话说:将
null
分配给字段与不指定所有字段具有相同的效果。大多数JSON解析器都是这样工作的。Go JSON marshaller支持不指定空字段 *:
最后,这取决于你想用JSON做什么:)