golang中序列化和反序列化时JSON属性的不同名称

Posted

技术标签:

【中文标题】golang中序列化和反序列化时JSON属性的不同名称【英文标题】:Different names of JSON property during serialization and deserialization in golang 【发布时间】:2021-07-22 00:06:05 【问题描述】:

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

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

type Coordinates struct 
  red int

对于 JSON 的反序列化,希望有这样的格式:


  "red":12

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


  "r":12

【问题讨论】:

【参考方案1】:

标准库不支持开箱即用,但使用自定义 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(outR: 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

【讨论】:

【参考方案2】:

有几种选择:

    使用地图 使用两个结构并强制转换:
type Coordinates1 struct 
   Red int `json:"red"`


type Coordinates2 struct 
   Red int `json:"r"`


// Cast from first to second:
var x Coordinates1
json.Unmarshal(data,&x)
y:=*(*Coordinates2)(&x)
json.Marshal(y)

【讨论】:

也可以使用自定义的Marshal 和/或Unmarshal 方法。

以上是关于golang中序列化和反序列化时JSON属性的不同名称的主要内容,如果未能解决你的问题,请参考以下文章

Golang---序列化和反序列化

使用Newtonsoft.Json.dll序列化和反序列化

用Jackson进行Json序列化时的常用注解

JSON序列化

无法反序列化当前的JSON对象,为啥

具有 IEnumerable<ISomeInterface> 类型属性的 NewtonSoft.Json 序列化和反序列化类