斯蒂芬的回答是完整的。顺便说一句,如果您真正想要的是 json 中的小写键,您可以手动指定键名,如下所示:
type Whatever struct {
SomeField int `json:"some_field"`
}
以这种方式,编组一个 What 会为字段 SomeField 生成键“some_field”(而不是在您的 json 中包含“SomeField”)。
如果您对保留未导出的字段一无所知,您还可以通过定义带有签名的方法来实现 json.Marshaler 接口MarshalJSON() ([]byte, error)
。一种方法是使用结构文字,它只是导出了未导出字段的版本,如下所示:
type Whatever struct {
someField int
}
func (w Whatever) MarshalJSON() ([]byte, error) {
return json.Marshal(struct{
SomeField int `json:"some_field"`
}{
SomeField: w.someField,
})
}
这可能有点麻烦,因此您也可以使用 amap[string]interface{}
如果您愿意:
func (w Whatever) MarshalJSON() ([]byte, error) {
return json.Marshal(map[string]interface{}{
"some_field": w.SomeField,
})
}
但是应该注意,编组interface{}
有一些注意事项,并且可以执行诸如编组uint64
到浮点数之类的操作,从而导致精度损失。(所有代码未经测试)