斯蒂芬的答案是完整的。顺便说一句,如果您真正想要的只是json中的小写键,则可以手动指定键名,如下所示:
type Whatever struct {
SomeField int `json:"some_field"`
}
这样,封送Whatever会为字段SomeField生成键“ some_field”(而不是在json中具有“ SomeField”)。
如果您对保留未导出的字段不满意,还可以通过定义一个带有signature的方法来实现json.Marshaler接口MarshalJSON() ([]byte, error)
。执行此操作的一种方法是使用仅具有未导出字段的导出版本的struct文字,如下所示:
type Whatever struct {
someField int
}
func (w Whatever) MarshalJSON() ([]byte, error) {
return json.Marshal(struct{
SomeField int `json:"some_field"`
}{
SomeField: w.someField,
})
}
这可能有点麻烦,因此map[string]interface{}
如果您愿意,也可以使用a :
func (w Whatever) MarshalJSON() ([]byte, error) {
return json.Marshal(map[string]interface{}{
"some_field": w.SomeField,
})
}
但是,应注意的是,封送处理interface{}
有一些注意事项,并且可能会像将封uint64
送给浮动车辆一样进行操作,从而导致精度损失。(所有代码未经测试)