Go 中的自定义 JSON 映射函数

Custom JSON mapping function in Go

所以我正在制作一个调用 restful API 的 Go 服务,我无法控制我正在调用的 API。

我知道 Go 在 NewDecoder->Decode 中有一个很好的内置反序列化器,但它只适用于以大写字母开头的结构字段(又名 public 字段)。这会带来问题,因为我尝试使用的 JSON 看起来像这样:

{
    "_next": "someValue",
    "data":  [{/*a collection of objects*/}],
    "message": "success"
}

我到底要怎么映射 "_next"

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

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

输出(在 Go Playground 上尝试):

{Next:someValue Data:[one 2] Message:success}

另请注意,您还可以解组为映射或 interface{} 值,因此您甚至不必创建结构,但使用起来不如结构方便:

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 Playground 上尝试):

map[_next:someValue data:[one 2] message:success]

标签将解决您的问题。

希望可以帮助到这里的其他人,您可以使用https://mholt.github.io/json-to-go/生成Go结构。在左边粘贴一个 JSON 结构,右边会生成等效的 Go 类型,你可以将其粘贴到你的程序中。