前言:java和go 我们都会遇到序列化以及反序列化,本次 介绍关于GO语言中json与结构体的各种处理.
一:标准的序列化和反序列化
type Student struct {
Id int64
Name string
Age int64
}
func main() {
s1 := Student{
Id: 1,
Name: "红孩儿",
Age: 18,
}
//序列化
b, err := json.Marshal(s1)
if err != nil {
fmt.Printf("json序列化失败, err:%v\n", err)
return
}
fmt.Printf("s1:%s\n", b)
var s2 Student
//反序列化
err = json.Unmarshal(b, &s2)
if err != nil {
fmt.Printf("json反序列化失败, err:%v\n", err)
return
}
fmt.Printf("s2:%v\n", s2)
}
打印结果:
从上面我们可以看到, 序列化与反序列化默认情况下使用结构体的字段名,但是有时候我们需要自定义名称,这个时候 就需要使用Tag
, Tag
是结构体的元信息,可以在运行的时候通过反射的机制读取出来.我们现在修改下结构体Student
在运行项目 查看:
二. 就是忽略某个字段 以及忽略掉一些空值字段
首先我们看name 我们已经被忽略掉 所以打印没有name的字段,在看 id 我们没有这个 但是 为什么打印会有id的值呢?因为 结构体中的字段没有值时,json 序列化的时候会默认输出字段的类型零值;int
和float
类型是 0,string
类型是""
,而对象类型是 nil)
但是 ,有时候 我们偏偏不想要这些没有值的字段,那么 我们就需要添加一个字段,omitempty
此时 就可以达到我们的要求了.
三:如何解决字符串格式的数字
开发过程中经常性会发生前端在传递来的json数据中可能会使用字符串类型的数字,如下截图 我们执行 就会报错,这个时候 我们只要在结构体里面添加一个string 就可以解决问题
1)未加string 报错
2)加string
可以看到此时没有报错.完美解决掉.