首页 > 解决方案 > 编组大型非结构化 REST/JSON 响应

问题描述

我花了很长时间弄清楚如何将大型非结构化 json 响应解组为可用对象。

这是一个示例响应(修剪以显示我遇到问题的部分)

由于这是一个非常大的 json 响应,因此已大大减少。为简单起见,我也将结构标记留在了下面。

{
    "responseStatus": "ok",
    "responseHeader": {
        "status": "ok",
        "requestId": "blah"
    },
    "responseData": {
        "records": [
            {
                "name": "blah",
                "site": {
                    "id": 1,
                    "name": "west"
                },
                "somevar1": "someval",
                "somevar2": {
                    "x": 2,
                    "y": 1
                },
                "entries": [
                    {
                        "model": "100",
                    },
                    {
                        "model": "200",
                    }
                ]
            },
      ]
}

所以记录是一个很大的“对象”列表。我需要将它们转换为我定义的类型。“条目”列表也需要转换为其对象类型。

type Record struct {
    Name         string
    Site         map[string]string
    Somevar1     string
    Somevar2     map[string]string
    Entries      []Entry
}

type Entry struct {
    Model       string

}

在这里,我可以将 responseData 放入一个可以迭代的对象中:

results := data["responseData"].(map[string]interface{})
devices := results["records"].([]interface{})

for _, device := range devices {
    fmt.Fprintf(os.Stdout, "%T\n", device)
    fmt.Fprintf(os.Stdout, "%+v\n", device)
}

这是 1 次迭代的示例输出:

map[string]interface {}
map[name:foo site:map[id:2 name:somewhere somevar1: blah somevar2:map[x:1 y:2] entries:[map[model:100]  map[model:200]

这就是我卡住的地方。我需要使用上面的这一行并将其转换为我的类型 Record,同时还将条目转换为 []Entry。

标签: jsongo

解决方案


Site将andSomevar2字段更改为map[string]interface{}或更改为适当的结构,因为它们对应的 json 包含整数,所以当你只使用map[string]string它时会失败。

除此之外,您的代码可以使用https://play.golang.com/p/rTgaXhXD1V6


推荐阅读