golang中序列化和反序列化期间JSON属性的不同名称
是否可能:在Golang中序列化/反序列化期间,结构中有一个字段,但名称不同 例如,我有结构“坐标” 要从JSON进行反序列化,请使用如下格式:golang中序列化和反序列化期间JSON属性的不同名称,json,go,struct,Json,Go,Struct,是否可能:在Golang中序列化/反序列化期间,结构中有一个字段,但名称不同 例如,我有结构“坐标” 要从JSON进行反序列化,请使用如下格式: { "red":12 } 但是当我序列化结构时,结果应该是这样的: { "r":12 } 有几种选择: 使用地图 使用两个结构和强制转换: 标准库不支持这种开箱即用的方式,但是使用custom/you可以做任何你想做的事情 例如: type Coordinates struct { Red i
{
"red":12
}
但是当我序列化结构时,结果应该是这样的:
{
"r":12
}
有几种选择:
标准库不支持这种开箱即用的方式,但是使用custom/you可以做任何你想做的事情 例如:
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))
输出(在上尝试):
还可以使用自定义的
Marshal
和/或Unmarshal
方法。
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))
{"r":12}