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

MrE*_*MrE 8 json go

我试图将json对象解析为结构,但设置为0的数值将不起作用.

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"}
Run Code Online (Sandbox Code Playgroud)

如果我将整数设置为0以外的任何值,这可以正常工作.

即使我解组对象并将Integer字段设置为0,将其编组回去也会删除"整数"字段.

为什么?以及如何解决这个问题?

编辑:

从我从评论中收集的内容,omitempty当值为0时触发.所以现在消失是有道理的.

我正在解析json,编辑它并将其转发到另一个服务,所以这是不幸的,特别是因为字段不存在默认为0以外的其他值,我宁愿不必为下游API提供默认值.

那么有没有办法省略空值但是保持0?

或者换成其他的东西?

我需要有2个结构:一个用于输入,一个用于输出?

Jim*_*imB 16

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

type Test struct {
    String  *string `json:"string,omitempty"`
    Integer *int    `json:"integer,omitempty"`
}
Run Code Online (Sandbox Code Playgroud)

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


小智 7

“ omitempty”标记仅适用于从structJSON的封送处理。它会跳过空值,因此它们不会出现在JSON中。它不会以任何方式影响拆封。如果要检测是否在JSON中指定了该字段,请使用指针。如果未指定该字段,则指针值为nil