您现在的位置是:网站首页> 编程资料编程资料
GoLang中Json Tag用法实例总结_Golang_
2023-05-26
241人已围观
简介 GoLang中Json Tag用法实例总结_Golang_
前言
GoLang中结构体的 JSON Tag 标识(英文名backquote或backtick,反引号 ` 符号包裹的部分内容)一直未明确看过完整规范和使用说明,存在模棱两可,系统整理如下:
- JSON Tag标签的完整语法,包含哪些选项
- 不同选项(输出名/-/omitempty/string)的作用及使用范围
- 特殊注意事项补充
Json中Tag用法汇总
- JSON Tag标签格式为:
json:"FieldName/-/可选,omitempty/可选,string/可选 - 多个选项之间使用 , 逗号分割
- FieldName选项:指定编码后键名称
- 可为空,则使用Struct对应字段名作为JSON输出名
- FieldName非空,则使用指定的FieldName作为JSON输出名
- -符号,输出时忽略此字段;但要注意-,(多一个逗号结尾)时,输出字段名为-的JSON字段,而不是忽略
- omitempty选项:忽略空值
- 包含此选项,输出时字段空值(零值+空值:false、0、nil指针、nil接口值,以及任何空数组、切片、map或字符串)则不输出
- string选项:结果输出为字符串
- 字段结果输出为字符串
- 只适用于字符串、浮点、整数或布尔类型的字段
- 这种额外的编码有时在与 JavaScript 程序通信时使用
- 要注意,如果字段值本身为string时,再次增加JSON的string标签选项,会导致多个引号的情况
// 示例代码:https://go.dev/play/p/ApzFQttV_MB package main import ( "encoding/json" "fmt" "os" ) func main() { type ColorGroup struct { Hello bool `json:"Hello,string"` world bool `json:"World,string"` ID int `json:"id,string"` Name string `json:"name,string"` Colors []string `json:"ColorName,omitempty"` Colors1 []string `json:"ColorName1"` Colors2 []string `json:"ColorName2"` } group := ColorGroup{ Hello: true, world: true, ID: 1, Name: "Reds", Colors: []string{"hello", "world"}, Colors1: nil, Colors2: []string{}, } b, err := json.Marshal(group) if err != nil { fmt.Println("error:", err) } os.Stdout.Write(b) } // 输出结果 //{"Hello":"true","id":"1","name":"\"Reds\"","ColorName":["hello","world"],"ColorName1":null,"ColorName2":[]}其他注意:
- nil 指针、nil 接口、nil切片等nil类型值,进行编码后为 null JSON 对象
- 空切片、空数组编码为 [] JSON 数组
- map 编码为 {} JSON 对象
- 指针类型值编码为指针所指向的值,接口类型值编码后为对应类型的值
官方 Marshal 函数说明
func Marshal(v interface{}) ([]byte, error)
Marshal 返回变量 v 的 JSON 编码后结果
Marshal 函数会递归的处理变量 v;如果一个值实现了Marshaler接口,并且不是一个nil指针,Marshal 调用其 MarshalJSON 方法来生成 JSON 数据。如果没有 MarshalJSON 方法但实现了 encoding.TextMarshaler 方法,Marshal 调用 MarshalText 方法并将结果编码为 JSON 字符串。nil 指针异常并不是严格意义上的必须,而是模仿了UnmarshalJSON行为中的一个类似的、必须的异常。
否则,Marshal使用以下与类型有关的默认编码:
- 布尔值被编码为JSON布尔值
- 浮点、整数和数值类型值编码为JSON数字
- 字符串值被编码为JSON字符串,被强制为有效的UTF-8,用Unicode替换符文替换无效的字节。为了使JSON能够安全地嵌入到HTML