json.Unmarshal似乎没有注意struct标签

时间:2014-01-06 06:03:11

标签: json go

我有一个看起来像这样的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中。我错过了什么?

1 个答案:

答案 0 :(得分:3)

encoding/json模块要求struct标签为命名空间。所以你想要这样的东西:

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

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