阅读 133

go json struct 系列问题

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"}}
复制代码

完美解决

文章分类
后端
文章标签