Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
golang中序列化和反序列化期间JSON属性的不同名称_Json_Go_Struct - Fatal编程技术网

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

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

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

例如,我有结构“坐标”

要从JSON进行反序列化,请使用如下格式:

{
  "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}