gpt4 book ai didi

json.Unmarshal 似乎没有注意结构标签

转载 作者:IT王子 更新时间:2023-10-29 01:07:35 27 4
gpt4 key购买 nike

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

{"API version":"1.2.3"}

我想使用 json.Unmarshal() 将它转换为一个对象去功能。根据this blog post :

How does Unmarshal identify the fields in which to store the decoded data? For a given JSON key "Foo", Unmarshal will look through the destination struct's fields to find (in order of preference):

  • An exported field with a tag of "Foo" (see the Go spec for more on struct tags),
  • An exported field named "Foo", or
  • An exported field named "FOO" or "FoO" or some other case-insensitive match of "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 中。我错过了什么?

最佳答案

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

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

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

关于json.Unmarshal 似乎没有注意结构标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20943963/

27 4 0