Go 结构体中声明 `json:"name"` 有什么作用?

在使用 Go 语言的过程中,有时间出现需要将 JSON 数据转化为 Go 能处理的数据结构。

假如有这样一个 JSON 文件:

{
   "name":"yuzhou1su",
   "age":18,
   "address":{
      "road":"renmin south road",
      "street":"123 street",
      "city":"cs",
      "province":"hn",
      "country":"cn"
   }
}

在定义 Go 结构体的过程中,我们会定义这样的结构体来接收这个 JSON 数据:

type Person struct {
    Name    string `json:"name"`
    Age     int    `json:"age"`
    Address struct {
        Road     string `json:"road"`
        Street   string `json:"street"`
        City     string `json:"city"`
        Province string `json:"province"`
        Country  string `json:"country"`
    } `json:"address"`
}

但是好像定义为也没什么问题:

type Person struct {
    Name    string
    Age     int
    Address struct {
        Road     string
        Street   string
        City     string
        Province string
        Country  string
    }
}

问题来了:Name string 后面跟的 json:"name" 和其他 json:"age" 有什么实际含义呢?

本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。
阅读 2k
2 个回答

如果数据都是正常的,那定义或者不定义都行。
但是从可读性和严谨来看,定义 tag 是有必要的
有可能需要返回的并不是 name ,而是 Name ,这时候就需要将 tag 设置成 json:"Name"

json:* 是自定义 json 序列化配置

当未配置 json:* 时(默认)其实是以字段名做为标识序列化的,所以也不会有问题。但有时候在序列化过程中会需要一些更为细节的控制,比如对于日期类型的字段开发者可能会希望以不同格式来序列化它('2000-12-12'1680075038737等),或者序列化时想给某个字段使用一个自定义的别名,这时候json:* 就可以上场了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏