网站建设栏目层级,北京保障房建设项目网站,asp网站 底部版权所有,电子商务网站建设考试在编写 Web Service 等涉及数据序列化和反序列化的场景#xff0c;对于 JSON 类型的数据#xff0c;在 Go 中我们经常会使用到 encoding/json Package。最近微有所感#xff0c;小水一篇
omitempty
JSON 数据的 UnMarshal 我们经常会配合 Struct Tags 使用#xff0c;让 …在编写 Web Service 等涉及数据序列化和反序列化的场景对于 JSON 类型的数据在 Go 中我们经常会使用到 encoding/json Package。最近微有所感小水一篇
omitempty
JSON 数据的 UnMarshal 我们经常会配合 Struct Tags 使用让 Struct 的 Filed 与 JSON 数据的指定 property 绑定。
如果要序列化为 Go Struct 的 JSON 数据对应的 Fields 相关的 JSON properties 是缺失的我们经常会用 omitempty 标记 Go Fields序列化时JSON 数据中缺少的属性将会被设置为 Go 中对应的 zero-value比如
package mainimport (encoding/jsonfmt
)type Person struct {Name string json:nameAge string json:age,omitemptyWeak bool json:weak,omitempty
}func main() {jsonData : {name:ShanSan}req : Person{}_ json.Unmarshal([]byte(jsonData), req)fmt.Printf(%v, req)fmt.Println(req.Age)
}
// output
// {Name:ShanSan Age: Weak:false}
//
Go Playground Link
但上面的例子对于一些场景的处理可能会有问题。看下下面这个例子
package mainimport (encoding/jsonfmt
)type Person struct {Name string json:nameAge string json:age,omitemptyWeak bool json:weak,omitempty
}func main() {jsonData : {name:ShanSan, age: }req : Person{}_ json.Unmarshal([]byte(jsonData), req)fmt.Printf(%v, req)fmt.Println(req.Age)
}
// output
// {Name:ShanSan Age: Weak:false}
//
可以看到 age 为 时和缺省时的结果是一样的。很显然上面的写法缺省的字段和空字段是没有被区分开的。对于一些数据的 Update 操作比如我们只想 Update Name 字段对应的 JSON 数据为 {name:ShanSan}执行上述的反序列化动作Age 字段会被设置为 empty stringWaek 也被设置为了 false这显然不是我们想看到的。
nil 一下
我们可以指针类型pointer type对上面的情况区分一下
package mainimport (encoding/jsonfmt
)type Person struct {Name *string json:nameAge *string json:age,omitemptyWeak *bool json:weak,omitempty
}func main() {jsonData : {name:ShanSan}jsonDataEmptyAge : {name:ShanSan, age: }req : Person{}reqEmptyAge : Person{}_ json.Unmarshal([]byte(jsonData), req)_ json.Unmarshal([]byte(jsonDataEmptyAge), reqEmptyAge)fmt.Printf(%v, req)fmt.Printf(%v, reqEmptyAge)
}
// {Name:0xc000010390 Age:nil Weak:nil}{Name:0xc0000103c0 Age:0xc0000103d0 Weak:nil}
emmm缺省的字段为 nil 了。
Marshal 的时候
序列化 struct 的时候如果使用了 omitempty也会出现类似上面反序列化的情况对于缺省的 field 或者 zero-value序列化得到的 JSON 数据也会缺省相关属性此时我们也可以通过 pointer 保留相关字段如下
package mainimport (encoding/jsonfmt
)type Student struct {Name string json:nameScore int json:score,omitempty
}type StudentWithPointer struct {Name string json:nameScore *int json:score,omitempty
}func main() {student : Student{Name: ShanSan,Score: 0,}score : 0studentWithPointer : StudentWithPointer{Name: ShanSan,Score: score,}data, _ : json.Marshal(student)dataWithPointer, _ : json.Marshal(studentWithPointer)fmt.Println(string(data))fmt.Println(string(dataWithPointer))
}
// {name:ShanSan}
// {name:ShanSan,score:0}
Go Playground
参考
encoding/jsonDifferentiate between empty and not-set fields with JSON in GolangGos omitempty explained 本文由博客群发一文多发等运营工具平台 OpenWrite 发布