编组时忽略JSON标记

Dan*_*nyB 2 json go

我从外部源获取JSON数据.这个JSON中的字段名称不是我想带的东西,所以我将它们转换为使用json:"originalname"标签对我有意义的名称.

当我将这样的对象编组回JSON时,我自然会再次获得丑陋的(原始)名称.

编组时是否有办法忽略标签?或者为马歇尔和unmarshall指定不同名称的方法?

为了澄清,我在操场上准备了一个例子,并在下面粘贴了相同的代码.

提前致谢.

package main

import (
    "encoding/json"
    "fmt"
)

type Band struct {
    Name   string `json:"bandname"`
    Albums int    `json:"albumcount"`
}

func main() {
    // JSON -> Object
    data := []byte(`{"bandname": "AC/DC","albumcount": 10}`)
    band := &Band{}
    json.Unmarshal(data, band)

    // Object -> JSON
    str, _ := json.Marshal(band)
    fmt.Println("Actual Result: ", string(str))
    fmt.Println("Desired Result:", `{"Name": "AC/DC","Albums": 10}`)

    // Output:
    // Actual Result:  {"bandname":"AC/DC","albumcount":10}
    // Desired Result: {"Name": "AC/DC","Albums": 10}
}
Run Code Online (Sandbox Code Playgroud)

thw*_*hwd 5

你可以实施

type Marshaler interface {
        MarshalJSON() ([]byte, error)
}
Run Code Online (Sandbox Code Playgroud)

来自标准库的encoding/json包.例:

type Band struct {
    Name   string `json:"bandname"`
    Albums int    `json:"albumcount"`
}

func (b Band) MarshalJSON() ([]byte, error) {
    n, _ := json.Marshal(b.Name)
    a, _ := json.Marshal(b.Albums)
    return []byte(`{"Name":` + string(n) + `,"Albums":` + string(a) + `}`)
}
Run Code Online (Sandbox Code Playgroud)

不过,这无疑是一个非常好的解决方案.