json - golang序列化反序列化时JSON属性名称不同

标签 json go struct

是否可能:结构中有一个字段,但在 Golang 的序列化/反序列化过程中为它取不同的名称?

例如,我有结构“坐标”。

type Coordinates struct {
  red int
}

对于 JSON 的反序列化,需要这样的格式:

{
  "red":12
}

但是当我将结构序列化时,结果应该是这样的:

{
  "r":12
}

最佳答案

标准库不支持开箱即用,但使用自定义 marshaler/unmarsaler你可以做任何你想做的事情。

例如:

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}

关于json - golang序列化反序列化时JSON属性名称不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67303521/

相关文章:

java - 使用 Jackson 序列化时,如何仅在 JSON 中而不是字符串中保留 Long 作为数字?

go - 使用 Go 包中的私有(private) "lowercase"函数

json - Spark JSON 将 JSON 中完整的字段读取到案例类中

json - jquery 1.9 .ajax() 数据类型默认更改?

python - 在python3.6中将两个jsonl(json行)文件合并并写入到一个新的jsonl文件中

goroutine 等待 channel 的响应并继续

go - 如何检查对象是否具有特定方法?

c++ - 在 C++ 中添加互斥锁后结构中的赋值运算符

c - 在这种情况下如何正确地将指针分配给结构变量?

c - 结构数组的赋值