GoLang中Json Tag用法实例总结

前言

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

你可能感兴趣的:(GoLang中Json Tag用法实例总结)