Golang:Unmarshal / Marshal json,int设置为0似乎不起作用

时间:2016-07-20 17:00:35

标签: json go

我正在尝试将 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个结构:一个用于输入,一个用于输出?

4 个答案:

答案 0 :(得分:14)

使用字段指针,以便可以将JSON类型的零值与缺失值区分开来。

type Test struct {
    String  *string `json:"string,omitempty"`
    Integer *int    `json:"integer,omitempty"`
}

https://play.golang.org/p/yvYSHxubLy

答案 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