Go中带有JSON Marshal的小写JSON密钥名称


175

我希望使用该"encoding/json"软件包封送在我的应用程序的一个导入软件包中声明的结构。

例如。:

type T struct {
    Foo int
}

因为是导入的,所以结构中所有可用的(导出的)字段都以大写字母开头。但我希望使用小写的键名:

out, err := json.Marshal(&T{Foo: 42})

将导致

{“ Foo”:42}

但我希望得到

{“ foo”:42}

是否可以通过一些简单的方法解决问题?


5
@Zippoxer:我要说:严格定义为小写字母的客户端/服务器通信协议中的密钥。嗯,就我而言,这没关系,因为我自己定义了协议。但是至少在理论上?但是,我知道主要是我在一个愚蠢的小细节上花了太多时间。
ANisus 2012年

不要道歉 您不是愚蠢的人,不接受完整的json规范的语言是愚蠢的人(尽管此问题很容易解决,如下所示)。
Jehan 2015年

@ANisus:我误读了您关于结构键名而不是JSON键名的问题。撤回表决。
Flimzy

Answers:


265

看一下encoding / json.Marshal的文档。它讨论了如何使用struct字段标记来确定如何格式化生成的json。

例如:

type T struct {
    FieldA int    `json:"field_a"`
    FieldB string `json:"field_b,omitempty"`
}

这将生成JSON,如下所示:

{
    "field_a": 1234,
    "field_b": "foobar"
}

8
字段标签?哦,我的..在搜索文档时,我错过了整个部分。我正在寻找标志,功能或其他设置。好吧,这是我想要的确切答案!此外,我还有一个新的Go概念要学习:字段标签:)
ANisus 2012年

他们很方便。您可以在运行时通过reflect包访问它们。
吉姆特,2012年

是的,在使用反射进行工作时,我发现拥有将元数据添加到字段中的方法是一件多么美妙的事情!顺便说一句,只是尝试了答案。奇迹般有效。
阿尼斯(Anisus)2012年

5
我刚刚开始诅咒go语言-这是多么愚蠢,为什么他们要在生成的JSON等中使用小写字母组成字段,等等。然后我遇到了这个线程,并认为“ OMG太好了!”。我什至跳了起来,并向女友解释了为什么我如此兴奋:D它是如此的酷:)))
nyxz 2014年

11
确保冒号和标签的第一个引号之间没有空格!使用json:"some_tag"代替json: "some_tag"。我被这个咬了一段时间。
大卫·莫拉莱斯

8

您可以使用要导出的键制作自己的结构,并为它们提供适当的json标记以使用小写名称。然后,您可以将所需的结构复制到您的结构中,然后再将其编码为JSON。或者,如果您不想打扰制作本地结构,则可以制作一个map[string]interface{}并进行编码。


愚蠢的是,其他包装(包含类型)实际上也是我的。但是,是的,我可能一直盯着它一定是一个结构的事实。map[string]interface{}只要我不最终使用嵌套的对象/结构,使用a 就会起作用
ANisus 2012年

1
@ANisus:哦,我的回答是基于您不受结构定义的控制。jimt的答案肯定是您想要的。
莉莉·巴拉德

是的,我不清楚它是否是外部软件包。但是,在您无法控制定义的情况下,您的答案仍然有意义且有用。
阿尼斯(Anisus)2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.