我希望使用"encoding/json"包来封送在我的应用程序的一个导入包中声明的结构。例如:
"encoding/json"
type T struct { Foo int }
因为它是导入的,所以结构体中所有可用的(导出的)字段都以大写字母开头,但我希望键名称是小写的:
out, err := json.Marshal(&T{Foo: 42})
将导致{"福":42}但我希望{" foo ":42}有没有可能用一些简单的方法来解决这个问题?
nxowjjhe1#
请查看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" }
9lowa7mx2#
你可以用你想要导出的键来创建自己的结构体,并给它们指定合适的json标签来表示小写名称,然后你可以在将其编码为JSON之前将所需的结构体复制到你的结构体中,或者如果你不想麻烦地创建一个本地结构体,你可以创建一个map[string]interface{}并对其进行编码。
map[string]interface{}
xmakbtuz3#
我只想补充一点,你可以使用gopls自动生成这些标记,手工添加标记是一项繁重的任务,特别是对于大型json结构体,所以这个特性是一个节省时间的特性。添加gopls langserver会因用户首选的编辑器而异。
gopls
go install golang.org/x/tools/gopls@latest
对于带有CoC的Neovim,您可以先:CocInstall coc-go,然后go.tags.add。有关CoC扩展的完整文档,请参见here。
:CocInstall coc-go
go.tags.add
ncecgwcz4#
可以使用fatih/gomodifytags生成结构字段的json:"camelCase"标记。例如:
json:"camelCase"
$ gomodifytags -file main.go -struct T -add-tags json -transform camelcase -quiet -w
NB:您还可以使用-override覆盖现有标记。
-override
4条答案
按热度按时间nxowjjhe1#
请查看encoding/json.Marshal的文档,其中讨论了如何使用struct字段标记来确定生成的json的格式。
例如:
这将生成如下所示的JSON:
9lowa7mx2#
你可以用你想要导出的键来创建自己的结构体,并给它们指定合适的json标签来表示小写名称,然后你可以在将其编码为JSON之前将所需的结构体复制到你的结构体中,或者如果你不想麻烦地创建一个本地结构体,你可以创建一个
map[string]interface{}
并对其进行编码。xmakbtuz3#
我只想补充一点,你可以使用
gopls
自动生成这些标记,手工添加标记是一项繁重的任务,特别是对于大型json结构体,所以这个特性是一个节省时间的特性。添加
gopls
langserver会因用户首选的编辑器而异。对于带有CoC的Neovim,您可以先
:CocInstall coc-go
,然后go.tags.add
。有关CoC扩展的完整文档,请参见here。ncecgwcz4#
可以使用fatih/gomodifytags生成结构字段的
json:"camelCase"
标记。例如:
NB:您还可以使用
-override
覆盖现有标记。