【json】go省略标签

问题

在网络通信时,往往将结构体转换为json发送,在一些复杂的结构体中,往往存在嵌套结构,此时在嵌套结构中使用了omitempty是不生效的(如果不是指针类型的话),从而造成json转换失败,请求不到数据。

omitempty

对于基本类型

  • 不使用omitempty,转换时会有默认值
package main

import (
	"encoding/json"
	"fmt"
)

type Dog struct {
	Breed    string
	WeightKg int
}

func main() {
	d := Dog{
		Breed: "pug",
	}
	b, _ := json.Marshal(d)
	fmt.Println(string(b))
}

输出

{"Breed":"pug","WeightKg":0}
  • 使用omitempty,转换时会忽略该字段
package main

import (
	"encoding/json"
	"fmt"
)

type Dog struct {
	Breed    string
	WeightKg int `json:",omitempty"`
}

func main() {
	d := Dog{
		Breed: "pug",
	}
	b, _ := json.Marshal(d)
	fmt.Println(string(b))
}

输出

{"Breed":"pug"}
  •  使用omitempty且值为0或""或nil,此时即使赋值这些也会忽略该字段,此时可以使用指针
package main

import (
	"encoding/json"
	"fmt"
)

type Restaurant struct {
	NumberOfCustomers int`json:",omitempty"`
}

func main() {
	d := Restaurant{
		NumberOfCustomers: 0,
	}
	b, _ := json.Marshal(d)
	fmt.Println(string(b))
}

输出

{}

 

package main

import (
	"encoding/json"
	"fmt"
)

type Restaurant struct {
	NumberOfCustomers *int `json:",omitempty"`
}

func main() {
	n := 0
	d := Restaurant{
		NumberOfCustomers: &n,
	}
	b, _ := json.Marshal(d)
	fmt.Println(string(b))
}

输出

{"NumberOfCustomers":0}

对于嵌套结构体

使用omitempty而不使用指针类型,并不能省略,而是生成默认值

package main

import (
	"encoding/json"
	"fmt"
)

type dimension struct {
	Height int
	Width  int
}

type Dog struct {
	Breed    string
	WeightKg int
	Size     dimension `json:",omitempty"`
}

func main() {
	d := Dog{
		Breed: "pug",
	}
	b, _ := json.Marshal(d)
	fmt.Println(string(b))
}

输出

{"Breed":"pug","WeightKg":0,"Size":{"Height":0,"Width":0}}

 使用omitempty而使用指针类型,可以被省略

package main

import (
	"encoding/json"
	"fmt"
)

type dimension struct {
	Height int
	Width  int
}

type Dog struct {
	Breed    string
	WeightKg int
	Size     *dimension `json:",omitempty"`
}

func main() {
	d := Dog{
		Breed: "pug",
	}
	b, _ := json.Marshal(d)
	fmt.Println(string(b))
}

输出

{"Breed":"pug","WeightKg":0}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱在桂子山

再不打赏我就失业了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值