JSON马歇尔nullable type value in database/sql Go

kgsdhlau  于 2023-05-04  发布在  Go
关注(0)|答案(3)|浏览(155)

我试图弄清楚如何在Go中正确地将hsall可空类型(string,int,time)正确地marhsall到JSON。我知道database/sql提供了sql.NullTimesql.NullInt等,但是当你马歇尔这些值时,你会得到类似于

{"first_name": {
  "Value": "",
  "Valid": false,
}}

我真正想要的是

{"first_name": null}

我知道你可以实现你自己的MarshalJSON来完成这个任务(我在这里写了http://dennissuratna.com/marshalling-nullable-string-db-value-to-json-in-go/
但我想知道是否有人知道更好的方法来做到这一点。我想知道其他人知道一个不那么乏味的方法来做到这一点。

pjngdqdw

pjngdqdw1#

可能是晚了,但当搜索同样的问题谷歌报告此页面在一个高排名,所以:我的解决方案是定义特殊类型,例如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执行相同的操作。希望能帮上忙

yrwegjxp

yrwegjxp2#

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

ioekq8ef

ioekq8ef3#

如果你真的想要空字段,你将不得不求助于一个自定义的编组器(或者,也许,只是也许,在结构中使用*string字段并分配nil而不是空字符串)。
然而,如果你看一下JSON(JavaScript对象表示法)的最初目标,你会注意到在JavaScript中,几乎没有任何区别:

var obj = JSON.parse('{"first_name": null }');
alert(obj.first_name)

以及:

var obj = JSON.parse('{}');
alert(obj.first_name)

换句话说:将null分配给字段与不指定所有字段具有相同的效果。大多数JSON解析器都是这样工作的。
Go JSON marshaller支持不指定空字段 *:

type MyType struct {
    firstname string `json:omitempty`
}

最后,这取决于你想用JSON做什么:)

相关问题