您现在的位置是:网站首页> 编程资料编程资料

GoLang中Json Tag用法实例总结_Golang_

2023-05-26 239人已围观

简介 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