1 json struct互转示例
在一次业务开发中,下游提供的接口中有多个字段,但是我们只需要其中一部分字段的数据,示例如下 下游接口返回的json格式数据如下
{
"resInfo":{
"id":"65823659689",
"name":"chenheng",
"description":"test",
"status":"success",
"followLists":[43156,562158,35267
]
}
}
正常情况下我们需要定义如下的struct来匹配json中的数据
type ResInfo struct {
Id string `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
Status string `json:"status"`
FollowLists []int `json:"followLists"`
}
type ResInfos struct {
ResInfo ResInfo `json:"resInfo"`
}
在main函数中测试一下
var res ResInfos
b := []byte(`{
"resInfo":{
"id":"65823659689",
"name":"chenheng",
"description":"test",
"status":"success",
"followLists":[43156,562158,35267]
}
}`)
json.Unmarshal(b, &res)
fmt.Println(res)
运行结果如下:
{{65823659689 chenheng test success [43156 562158 35267]}}
回到刚开始提到的问题,如果我们只需要下游接口返回数据中的id,name字段呢,这个时候要如何定义struct呢 json tag中的omitempty标签是如果json反序列化的时候中没有这些字段则不显示,明显不能用在这里。经过试验之后发现我们只要在struct中不定义不需要的字段,就算接口给你返回所有字段的数据,你只定义了id,name字段,他就只解析这俩字段的数据,代码如下
type ResInfo struct {
Id string `json:"id"`
Name string `json:"name"`
}
还是用全部字段的值来反序列化这个struct,看看结果如何
var res ResInfos
b := []byte(`{
"resInfo":{
"id":"65823659689",
"name":"chenheng",
"description":"test",
"status":"success",
"followLists":[43156,562158,35267]
}
}`)
json.Unmarshal(b, &res)
fmt.Println(res)
结果如下所示:
{{65823659689 chenheng}}
完美解决
struct为空时不返回给上游空json串
在业务开发中,使用多个匿名字段组合为一个返回给上游的json串,但是现在有一个struct的值为空,不想返回给上游,那么需要怎么办,举例如下:
type ResInfo struct {
Id string `json:"id"`
Name string `json:"name"`
}
type OrderInfo struct {
OrderId string `json:"order_id,omitempty"`
OrderTime string `json:"order_time,omitempty"`
}
type ResInfos struct {
ResInfo ResInfo `json:"resInfo"`
OrderInfo OrderInfo `json:"order_info,omitempty"`
}
main函数
resinfo := &ResInfos{
ResInfo: ResInfo{
Id: "645754774",
Name: "hgfh",
},
OrderInfo: OrderInfo{},
}
res,_:= json.Marshal(resinfo)
fmt.Println(string(res))
打印结果如下:
{"resInfo":{"id":"645754774","name":"hgfh"},"order_info":{}}
由于resinfo结构体没有初始化OrderInfo结构体的信息,所以导致反序列化为{},但是这对上游用户是不友好的,有什么办法能解决呢,那就是定义OrderInfo为指针类型即可。
type ResInfos struct {
ResInfo ResInfo `json:"resInfo,omitempty"`
OrderInfo *OrderInfo `json:"order_info,omitempty"`
}
main函数中
resinfo := &ResInfos{
ResInfo: ResInfo{
Id: "645754774",
Name: "hgfh",
},
OrderInfo: nil,
}
res,_:= json.Marshal(resinfo)
fmt.Println(string(res))
打印结果如下:
{"resInfo":{"id":"645754774","name":"hgfh"}}
完美解决