文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

GoLang中Json Tag用法实例总结

2024-04-02 19:55

关注

前言

GoLang中结构体的 JSON Tag 标识(英文名backquote或backtick,反引号 ` 符号包裹的部分内容)一直未明确看过完整规范和使用说明,存在模棱两可,系统整理如下:

Json中Tag用法汇总

// 示例代码: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":[]}

其他注意:

官方 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使用以下与类型有关的默认编码:

结构体字段Tag标签下 json 键对应格式化字符串说明:

结构体字段标签和对应含义的一些例子:

// Field appears in JSON as key "myName".
// 该字段出现在JSON中时,名为"myName"
Field int `json:"myName"`

// Field appears in JSON as key "myName" and
// the field is omitted from the object if its value is empty,
// as defined above.
// 该字段出现在JSON中时,名为"myName",如为零值则输出时忽略此字段
Field int `json:"myName,omitempty"`

// Field appears in JSON as key "Field" (the default), but
// the field is skipped if empty.
// Note the leading comma.
// 该字段出现在JSON中时,名为"Field",如为零值则输出时忽略此字段
Field int `json:",omitempty"`

// Field is ignored by this package.
// 该字段当前包输出JSON时忽略
Field int `json:"-"`

// Field appears in JSON as key "-".
// 该字段出现在JSON中时,名为"-"
Field int `json:"-,"`

"string" 选项表示字段以 JSON 格式存储在 JSON 编码的字符串中。它只适用于字符串、浮点、整数或布尔类型的字段。这种额外的编码有时在与JavaScript程序通信时使用。

Int64String int64 `json:",string"`

键名满足以下条件时将被使用:非空字符串,仅由Unicode字母、数字和ASCII标点符号(不包括引号、反斜杠和逗号)组成。

受下文所述的Go可见性规则的限制,匿名结构字段通常可被编码,其内部可导出的字段等价于外部结构中的字段。匿名结构体字段使用其JSON Tag标签中给出名称,而不是匿名的。接口类型的匿名结构字段的处理方式与将该类型作为其名称相同,也不是匿名。

在决定对哪个字段进行marshal或unmarshal时,Go中结构体字段可见性规则进行了调整。如果在同一级别有多个字段,并且该级别是嵌套最少的(且将是通常Go规则所选择的嵌套级别),则适用以下额外规则:

1) 在这些字段中,如果有任何字段是JSON Tag标记的,就只考虑有标记的字段,即使有多个未标记的字段,否则会发生冲突。

2) 如果只有一个字段(根据第一条规则标记或不标记),该字段被选中。

3) 否则有多个字段,都会被忽略;不会发生错误。

Go 1.1中新增了对匿名结构字段的处理。在Go 1.1之前,匿名结构字段被忽略。要在当前版本和早期版本中强制忽略匿名结构字段,请给该字段一个”-“的JSON标签。

Map的值被编码为JSON对象。地图的键类型必须是字符串、整数类型,或者实现了encoding.TextMarshaler接口。通过应用以下规则对Map的键进行排序并作为JSON对象的键使用,但要遵守上面为字符串值描述的UTF-8强制规则。

- 任何字符串类型的键都可以直接使用
- encoding.TextMarshalers 将被编码
- 整数键被转换为字符串

指针类型值被编码为所指向的值,一个 nil 指针会被编码为 null JSON值。

接口类型值编码为接口中包含的值,一个 nil 接口值被编码为 null JSON值。

通道(Channel)、复合类型(complex)和函数值(function)不能进行JSON编码,试图对这样的值进行编码会导致Marshal返回一个UnsupportedTypeError错误。
JSON不能代表循环嵌套的数据结构,Marshal函数也将不处理它们。向Marshal传递循环结构将导致一个错误。

参考

总结

到此这篇关于GoLang中Json Tag用法的文章就介绍到这了,更多相关GoLang中Json Tag用法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯