golang - 结构体omitempty踩坑案例

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
 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值