Go中使用JSON Marshal的小写JSON密钥名称

ANi*_*sus 157 json marshalling go

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

例如.:

type T struct {
    Foo int
}
Run Code Online (Sandbox Code Playgroud)

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

out, err := json.Marshal(&T{Foo: 42})
Run Code Online (Sandbox Code Playgroud)

会导致

{ "富":42}

但我希望得到

{ "foo" 的:42}

是否有可能以一种简单的方式解决问题?

jim*_*imt 243

看看编码/ json.Marshal的文档.它讨论了使用struct字段标记来确定生成的json的格式.

例如:

type T struct {
    FieldA int    `json:"field_a"`
    FieldB string `json:"field_b,omitempty"`
}
Run Code Online (Sandbox Code Playgroud)

这将生成JSON,如下所示:

{
    "field_a": 1234,
    "field_b": "foobar"
}
Run Code Online (Sandbox Code Playgroud)

  • 确保冒号和标签的第一个引号之间没有空格!使用`json:"some_tag"`而不是`json:"some_tag"`.我有一段时间了. (11认同)
  • 字段标签?哦,我的..在文档中搜索时我错过了整个部分.我在寻找旗帜,功能或其他一些设置.嗯,这是我正在寻找的确切答案!另外,我有一个新的Go概念来学习:字段标签:) (8认同)
  • 我刚刚开始诅咒go语言 - 这有多愚蠢,为什么他们会在生成的JSON等中使用小写字母等来制作字段等等.然后我遇到了这个帖子并且想到了"OMG那就太棒了!!!".我甚至跳了起来,解释了我的女朋友为什么我这么兴奋:D太酷了:))) (5认同)

Lil*_*ard 7

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


Pio*_*ski 6

我只会补充一点,您可以使用自动生成这些标签gopls。手动添加标签是一项琐碎的任务,尤其是对于大型 json 结构,因此该功能是一个救星。

添加gopls语言服务器根据个人的首选编辑器而有所不同。后:

go install golang.org/x/tools/gopls@latest
Run Code Online (Sandbox Code Playgroud)

对于带有 CoC 的 Neovim,您可以:CocInstall coc-go然后go.tags.add. 有关 Go 的 CoC 扩展的完整文档,请参阅此处

  • 如果您简单地告诉如何去做,这可能是一个很好的答案。我知道有人可以用谷歌搜索。但展示如何实现它实际上可以回答这个问题。 (3认同)