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

Eg.:

type T struct {
    Foo int
}

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

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

会导致

{“Foo”:42}

但我希望得到

{“foo”:42}

有没有可能用简单的方法解决这个问题?


当前回答

你可以用fatih/gomodifytags生成struct字段的json:"camelCase"标签。

e.g.

$ gomodifytags -file main.go -struct T -add-tags json -transform camelcase -quiet -w

注意:你也可以使用-override来覆盖现有的标签。

其他回答

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

看一下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"
}

我只会补充说,你可以自动生成这些标签使用gopls。手动添加标签是一项很简单的任务,特别是使用大型json结构时,因此该特性可以挽救生命。

根据首选编辑器的不同,添加gopls langserver会有所不同。后:

go install golang.org/x/tools/gopls@latest

对于带有CoC的Neovim,你可以:CocInstall CoC -go,然后go.tags.add。关于CoC扩展的完整文档请参见这里。

你可以用fatih/gomodifytags生成struct字段的json:"camelCase"标签。

e.g.

$ gomodifytags -file main.go -struct T -add-tags json -transform camelcase -quiet -w

注意:你也可以使用-override来覆盖现有的标签。