Go

时间:2017-03-27 15:16:24

标签: json go unmarshalling

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

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

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

我如何映射"_next"

2 个答案:

答案 0 :(得分:4)

使用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{}值中解组,因此您甚至不必创建结构,但使用结构时不会像使用它一样方便:< / p>

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]

答案 1 :(得分:0)

标签可以解决您的问题。

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