1.结构体跟json序列化
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"`
Stue string `json:"stue,omitempty"` // 反序列化时,如果该字段为空,则不进行序列化输出
Addr string `json:"addr"`
}
func main() {
data := `{
"name":"lk",
"addr":"xian"
}`
p := &Person{}
json.Unmarshal([]byte(data), p)
per, _ := json.MarshalIndent(p, "", " ")
fmt.Println(string(per))
}
输出结果:{
"name": "lx",
"addr": "xian"
}
2.嵌套结构存在的坑,即便使用omitempty进行修饰,仍旧存在问题。如下代码:
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"`
Stue string `json:"stue,omitempty"` // 反序列化时,如果该字段为空,则不进行序列化输出
Addr string `json:"addr"`
// Sub Subson `json:"sub",omitempty` // 嵌套结构,即便设置了该字段,仍旧不能进行空序列化处理,改进方案,设置成指针类型,
Sub *Subson `json:"sub",omitempty`
}
type Subson struct {
Right float32 `json:"right,omitempty"`
}
func main() {
data := `{
"name":"lk",
"addr":"xian"
}`
p := &Person{}
json.Unmarshal([]byte(data), p)
per, _ := json.MarshalIndent(p, "", " ")
fmt.Println(string(per))
}
输出结果:
{
"name": "lk",
"addr": "xian",
"sub": {} // 输出一个空结构,非预期的结果
}
改进方案:嵌套结构设置成指针类型,仍旧如上代码
输出结果:
{
"name": "lk",
"addr": "xian"
} //预期的输出结果
3.一些结构体存在某些初始化为0值的情况,如果使用omitempty修饰,会造成本预期想输出,但是实际不急行输出的情况,如下:
package main
import (
"encoding/json"
"fmt"
)
// 有些结构默认初始化为0值班,(并且设置字段为omitempty修饰)会导致不进行序列化,例如坐标(0,0),但是仍记希望输出该序列化数值,将结构成员定义成指针即可
type Subson struct {
// 该情况设置了omitempty,可能会因为初始化为(0,0),造成输出口空结构{},改进方案,定义成指针类型
Left float32 `json:"left,omitempty"`
Right float32 `json:"right,omitempty"`
// Left *float32 `json:"left,omitempty"`
// Right *float32 `json:"right,omitempty"`
}
func main() {
// 初始化为0案例
s := `{
"left":0.0,
"right":0.0
}`
su := &Subson{}
json.Unmarshal([]byte(s), su)
sss, _ := json.MarshalIndent(su, "", " ")
fmt.Println(string(sss))
}
输出结果:
{} // 因为是坐标,期望输出对应数据,但是非预期结果
改进方法:代码如上,将成员设置成指针即可。
{
"left": 0.0,
"right": 0.0
}