Go中的自定义JSON映射功能

cDe*_*r32 2 json go unmarshalling

因此,我正在制作一个Go服务,该服务调用了一个宁静的API,但我无法控制正在调用的API。

我知道Go在NewDecoder-> Decode中有一个不错的内置反序列化器,但是它仅适用于以大写字母开头的结构域(又称公共域)。这引起了一个问题,因为我要使用的JSON看起来像这样:

{
    "_next": "someValue",
    "data":  [{/*a collection of objects*/}],
    "message": "success"
}
Run Code Online (Sandbox Code Playgroud)

我将如何映射"_next"

icz*_*cza 5

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

type Something struct {
    Next    string        `json:"_next"`
    Data    []interface{} `json:"data"`
    Message string        `json:"message"`
}
Run Code Online (Sandbox Code Playgroud)

测试它:

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"
}`
Run Code Online (Sandbox Code Playgroud)

输出(在Go Playground上尝试):

{Next:someValue Data:[one 2] Message:success}
Run Code Online (Sandbox Code Playgroud)

还要注意,您还可以解组映射或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"
}`
Run Code Online (Sandbox Code Playgroud)

输出(在Go Playground上尝试):

map[_next:someValue data:[one 2] message:success]
Run Code Online (Sandbox Code Playgroud)