解组忽略空字段

Posted

技术标签:

【中文标题】解组忽略空字段【英文标题】:unmarshal ignore empty fields 【发布时间】:2014-09-27 13:21:07 【问题描述】:

成功提交用户详细信息后,我从客户端获得了 JSON。

可以跳过 JSON 中的某些元素,因为它们没有更新。

在 Go 服务器端,我定义了一个等效结构。

服务器成功地将 JSON 字节编组到结构中。

type user struct 
    Id       *int64  `json:",omitempty"`
    Name     *string `json:",omitempty"`
    Age      *int64  `json:",omitempty"`

但是对于没有从客户端接收到的字段,默认情况下 unmarshal 硬编码 nil 为字符串,空数组为字符串数组。

例如,如果我得到 json "Id" : 64, "Name" : "Ryan" , 我不希望 unmarshal 将其转换为 "Id" : some hexadecimal, "Name" : some hexadecimal, "Age" : nil。 为了简单起见,我希望它是"Id" : some hexadecimal, "Name" : some hexadecimal

我怎样才能完全忽略该字段并映射我得到的东西?

Goplayground 代码:http://play.golang.org/p/3dZq0nf68R

【问题讨论】:

我不明白这个问题。如果您在该字段中得到 nil,则表示 json 没有它的值,并且 unmarshall 会将其设置为该字段类型的默认“零”值。 如果 json 字段没有值,我不想要设置 nil 的功能。如果该字段不存在,我希望它完全忽略该字段,换句话说,json 仅包含具有值的字段。 我对 goLang 还是很陌生,只是想看看是否有这样的功能。我不明白这里有什么困惑。 @Pals:你终于得到答案了吗?您已标记答案的是 Marshal,但您提出了解组的问题。 【参考方案1】:

你有点困惑,fmt.Printf("%+v", animals) 打印 Go 结构,它总是会打印出所有指定的字段。

但是,如果将其转换回 json,它将省略 nil 字段。

查看http://play.golang.org/p/Q2M5oab2UX

【讨论】:

以上是关于解组忽略空字段的主要内容,如果未能解决你的问题,请参考以下文章

MySQL连接字段但忽略空字段

Mongoose 在聚合时忽略空字段

忽略 Json.net 中的空字段

如何忽略 ExtJS 数据模型中的空字段?

如何跳过字段并仅使用JAXB解组该字段的特定成员?

解决protobuf忽略空返回值的问题