我有一个看起来像这样的JSON对象:
{"API version":"1.2.3"}
我想在go中使用json.Unmarshal()
函数将其转换为对象。根据{{3}}:
Unmarshal
如何识别存储解码数据的字段?对于给定的JSON密钥"Foo"
,Unmarshal
将查看目标结构的字段以查找(按优先顺序):
- 标记为
"Foo"
的导出字段(有关结构标记的详情,请参阅this blog post),- 名为
的导出字段"Foo"
或- 名为
"FOO"
或"FoO"
的导出字段或"Foo"
的其他一些不区分大小写的匹配。
这由Go spec确认。
由于“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
中。我错过了什么?
答案 0 :(得分:3)
encoding/json
模块要求struct标签为命名空间。所以你想要这样的东西:
type ApiVersion struct {
Api_version string `json:"API version"`
}
这样做是为了使json
struct标签可以与来自其他库(例如XML编码器)的标签共存。