【问题标题】:json.Unmarshal doesn't seem to pay attention to struct tagsjson.Unmarshal 似乎不注意结构标签
【发布时间】:2014-01-06 06:03:11
【问题描述】:

我有一个如下所示的 JSON 对象:

{"API version":"1.2.3"}

我想使用 go 中的json.Unmarshal() 函数将它转换为一个对象。根据this blog post

Unmarshal 如何识别存储解码数据的字段?对于给定的 JSON 键 "Foo"Unmarshal 将通过目标结构的字段查找(按优先顺序):

  • 标签为"Foo" 的导出字段(有关结构标签的更多信息,请参见Go spec),
  • 名为"Foo" 的导出字段,或
  • 名为"FOO""FoO""Foo" 的其他一些不区分大小写的匹配项。

unmarshal documentation 确认了这一点。

由于“API 版本”中有一个空格,这不是有效的 go 标识符,所以我在字段上使用了一个标签:

type ApiVersion struct {
 Api_version string "API version"
}

我尝试像这样解组它:

func GetVersion() (ver ApiVersion, err error) {

 // Snip code that gets the JSON

 log.Println("Json:",string(data))
 err = json.Unmarshal(data,&ver)
 log.Println("Unmarshalled:",ver);
}

输出是:

2014/01/06 16:47:38 Json: {"API version":"1.2.3"}
2014/01/06 16:47:38 Unmarshalled: {}

如您所见,JSON 并未编组到 ver。我错过了什么?

【问题讨论】:

    标签: json go


    【解决方案1】:

    encoding/json 模块要求结构标签被命名空间。所以你想要的是这样的:

    type ApiVersion struct {
        Api_version string `json:"API version"`
    }
    

    这样做是为了使json struct 标签可以与来自其他库(例如 XML 编码器)的标签共存。

    【讨论】:

    • 这解决了问题!不过,我没有在任何地方的文档中发现这一点 - 我找错地方了吗?
    • “Unmarshal 使用 Marshal 使用的编码的逆编码”——然后如果您访问 Marshall 的文档,它有几个示例。我想文档的Unmarshal 部分中的另一个示例可能会有所帮助。
    猜你喜欢
    • 2018-10-02
    • 2015-03-29
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 2014-05-23
    相关资源
    最近更新 更多