json - golang中序列化和反序列化时JSON属性的不同名称
问题描述
是否有可能:在结构中有一个字段,但在 Golang 中的序列化/反序列化期间它的名称不同?
例如,我有结构“坐标”。
type Coordinates struct {
red int
}
对于 JSON 的反序列化,希望具有如下格式:
{
"red":12
}
但是当我将结构序列化时,结果应该是这样的:
{
"r":12
}
解决方案
标准库不支持开箱即用,但使用自定义编组器/解组器,您可以做任何您想做的事情。
例如:
type Coordinates struct {
Red int `json:"red"`
}
func (c Coordinates) MarshalJSON() ([]byte, error) {
type out struct {
R int `json:"r"`
}
return json.Marshal(out{R: c.Red})
}
(注意:必须导出结构字段才能参与编组/解组过程。)
测试它:
s := `{"red":12}`
var c Coordinates
if err := json.Unmarshal([]byte(s), &c); err != nil {
panic(err)
}
out, err := json.Marshal(c)
if err != nil {
panic(err)
}
fmt.Println(string(out))
输出(在Go Playground上试试):
{"r":12}
推荐阅读
- c# - 如何注释元素以及如何将新元素添加到 XML 上的特定位置?
- php - 如何将 div 保存到 acf 字段中?
- greenplum - 将表复制到 csv 时出现 Postgresql 语法错误
- typescript - 元素隐式具有“任何”类型,因为字符串类型的表达式 | number 不能用于索引类型
- javascript - D3 基于标题名称附加
- css-paged-media - 如何调试 CSS 分页媒体模板?
- azure-devops - REST API,从 CD 发布管道获取工作项 ID
- java - 在 Java 8 项目中使用 Java 11 jar/类 - 无法解析符号?
- git - Git:当完全相同的冲突再次发生时,我可以“挑选”合并冲突解决方案吗?
- java - 在 java 中 SSLv3 被禁用但在 javamail API ssl 中有效吗?