Go中的自定义JSON映射函数

Go中的自定义JSON映射函数,json,go,unmarshalling,Json,Go,Unmarshalling,因此,我正在创建一个调用restful API的Go服务,我无法控制我调用的API 我知道Go在NewDecoder->Decode中有一个很好的内置反序列化器,但它只适用于以大写字母开头的结构字段(也称为公共字段)。这带来了一个问题,因为我尝试使用的JSON如下所示: { "_next": "someValue", "data": [{/*a collection of objects*/}], "message": "success" } type Somethi

因此,我正在创建一个调用restful API的Go服务,我无法控制我调用的API

我知道Go在NewDecoder->Decode中有一个很好的内置反序列化器,但它只适用于以大写字母开头的结构字段(也称为公共字段)。这带来了一个问题,因为我尝试使用的JSON如下所示:

{
    "_next": "someValue",
    "data":  [{/*a collection of objects*/}],
    "message": "success"
}
type Something struct {
    Next    string        `json:"_next"`
    Data    []interface{} `json:"data"`
    Message string        `json:"message"`
}
我该如何映射
“\u next”

用于在JSON中指定字段名。您在上面发布的JSON对象可以这样建模:

{
    "_next": "someValue",
    "data":  [{/*a collection of objects*/}],
    "message": "success"
}
type Something struct {
    Next    string        `json:"_next"`
    Data    []interface{} `json:"data"`
    Message string        `json:"message"`
}
测试它:

func main() {
    var sg Something
    if err := json.Unmarshal([]byte(s), &sg); err != nil {
        panic(err)
    }
    fmt.Printf("%+v", sg)
}

const s = `{
    "_next": "someValue",
    "data":  ["one", 2],
    "message": "success"
}`
输出(在上尝试):

还请注意,您也可以将其解组为映射或
接口{}
值,因此您甚至不必创建结构,但使用它不会像使用结构那样方便:

func main() {
    var m map[string]interface{}
    if err := json.Unmarshal([]byte(s), &m); err != nil {
        panic(err)
    }
    fmt.Printf("%+v", m)
}

const s = `{
    "_next": "someValue",
    "data":  ["one", 2],
    "message": "success"
}`
输出(在上尝试):


标签将解决您的问题


希望它能帮助其他来这里的人,你可以利用它来生成Go结构。在左侧粘贴JSON结构,将在右侧生成等效的Go类型,您可以将其粘贴到程序中

啊,太完美了,这正是我想要的。接下来,当我将这个对象序列化回json时,有没有办法更改字段名?就像从“disc_firstname”读取,然后序列化回json时,将其映射到“firstname”?@cDecker32标记中指定的名称将在封送和解封时使用。因此,无法为mashalling提供值,也无法为同一结构上的解封提供不同的值?@cDecker32不带标记。您可以实现
json.Marshaler
json.Unmarshaler
来执行自定义转换,在它们中执行您想要的任何操作。