我希望使用“encoding/json”包来封送在我的应用程序的一个导入包中声明的结构。
Eg.:
type T struct {
Foo int
}
因为它是导入的,所以结构体中所有可用(导出)字段都以大写字母开头。但我希望有小写键名:
out, err := json.Marshal(&T{Foo: 42})
会导致
{“Foo”:42}
但我希望得到
{“foo”:42}
有没有可能用简单的方法解决这个问题?
我希望使用“encoding/json”包来封送在我的应用程序的一个导入包中声明的结构。
Eg.:
type T struct {
Foo int
}
因为它是导入的,所以结构体中所有可用(导出)字段都以大写字母开头。但我希望有小写键名:
out, err := json.Marshal(&T{Foo: 42})
会导致
{“Foo”:42}
但我希望得到
{“foo”:42}
有没有可能用简单的方法解决这个问题?
当前回答
您可以使用想要导出的键创建自己的结构,并为它们提供小写名称的适当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"
}
你可以用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]接口{}并对其进行编码。
我只会补充说,你可以自动生成这些标签使用gopls。手动添加标签是一项很简单的任务,特别是使用大型json结构时,因此该特性可以挽救生命。
根据首选编辑器的不同,添加gopls langserver会有所不同。后:
go install golang.org/x/tools/gopls@latest
对于带有CoC的Neovim,你可以:CocInstall CoC -go,然后go.tags.add。关于CoC扩展的完整文档请参见这里。