我正在尝试将 json 对象解析为 struct ,但整数值设置为0将无法正常工作。< / p>
q := []byte(`{"string":"this is a string", "integer": 0}`)
type Test struct {
String string `json:"string,omitempty"`
Integer int `json:"integer,omitempty"`
}
var qq Test
if err := json.Unmarshal(q, &qq); err != nil {
panic(err)
}
queryStr, err := json.Marshal(qq)
if err != nil {
panic(err)
}
fmt.Println(string(queryStr))
// Output: {"string": "this is a string"}
如果我将整数设置为0以外的任何值,这样可以正常工作。
即使我解组对象并将整数字段设置为0,将其编组也会删除&#34;整数&#34;字段。
为什么呢?以及如何解决这个问题?
修改:
从我从评论中收集到的内容,omitempty
在值为0时触发。所以现在消失是有意义的。
我正在解析json,编辑它并将其转发给另一个服务,所以这很不幸,特别是因为字段不存在默认为0以外的其他值,我宁愿不必输入默认值下游API。
那么有没有办法省略空值但是保持0?
或将其更改为其他内容?
我是否需要2个结构:一个用于输入,一个用于输出?
答案 0 :(得分:14)
使用字段指针,以便可以将JSON类型的零值与缺失值区分开来。
type Test struct {
String *string `json:"string,omitempty"`
Integer *int `json:"integer,omitempty"`
}
答案 1 :(得分:5)
“omitempty”标记仅适用于从 struct 到 JSON 的编组。它会跳过空值,因此它们不会出现在 JSON 中。它不会以任何方式影响解编。如果要检测是否在 JSON 中指定了字段,请使用指针。如果未指定该字段,则指针值将为 nil 。
答案 2 :(得分:0)
正如文档在https://golang.org/pkg/encoding/json/#Marshal
中所说的那样Struct值编码为JSON对象。每个导出的struct字段 成为对象的成员,除非
- 字段的标记是&#34; - &#34;或
- 该字段为空,其标记指定&#34; omitempty&#34;选项。 空值为false,0,任何nil指针或接口值,以及任何值 数组,切片,地图或长度为零的字符串。对象的默认密钥 string是结构字段名称,但可以在结构中指定 字段的标记值。 &#34; json&#34; struct字段中的键值是 键名,后跟可选的逗号和选项。
所以不,除非你为你的struct实现自己的marshaller
答案 3 :(得分:0)
您也可以使用 json.Number。 喜欢
type Test struct {
String string `json:"string,omitempty"`
Integer json.Number `json:"integer,omitempty"`
}
修改@Jimb的例子:https://play.golang.org/p/UzKnhvGhC1n