将复杂的JSON转换为Golang中的地图

时间:2017-08-02 20:25:57

标签: json go marshalling unmarshalling

如何将复杂的JSON对象转换为golang中具有所有正确类型的地图。我是否绝对需要做一个典型的Golang事情,我创建一个结构,其中包含我知道的字段,或者是否有一种通用的方法来获取所有正确类型的字段?

以下是我想要转换为地图的JSON示例:

{
    "people": [
        {
            "diffs": [
                77
            ],
            "original": {
                "name": "Nick",
                "active": "Active",
                "email": "nick@example.com"
            },
            "id": "21"
        }
    ]
}

1 个答案:

答案 0 :(得分:1)

您可以使用类型断言开关构建递归函数,以将JSON数组断言为多维映射或展平映射。不幸的是,你的多维地图会很快变得复杂。

我的意思是,当你有一个嵌套的JSON数组时,你经常需要映射至少几个维度(例如:map [string] map [string] map [string] string) "人"上方。

如果你试图压扁嵌套的JSON数组,你的密钥最终会重叠(即你只能使用" name" key一次)。你可以标记键 - 比如" name_1" :" Nick",但此解决方案可能不适用于您的用例。

如果你想进入多维路线,这个套餐可能会很好地满足你的需求: http://github.com/Jeffail/gabs

我将给你一个量身定制的例子,然后从gabs的github页面链接中找到两个例子:

package main

import (
    "fmt"
    "github.com/Jeffail/gabs"
)

func main() {

    jsonS := `{
        "people": [
            {
                "diffs": [
                    77
                ],
                "original": {
                    "name": "Nick",
                    "active": "Active",
                    "email": "nick@example.com"
                },
                "id": "21"
            }
        ]
    }`

    gabsCon, err := gabs.ParseJSON([]byte(jsonS))

    if err != nil {
        fmt.Println("gabs ParseJSON failed")
    }

    n1, ok := gabsCon.Path("people.original.name").Data().(string)

    if !ok {
        fmt.Println("gabs path failed")
    }

    fmt.Println(n1)
}

这是一个非定制的例子,可以打印 - 第一,第二,第三):

jsonParsed, _ := gabs.ParseJSON([]byte(`{"array":[ "first", "second", "third" ]}`))

// S is shorthand for Search
children, _ := jsonParsed.S("array").Children()
for _, child := range children {
    fmt.Println(child.Data().(string))
}

另一个例子,可以打印 - 1,2,3:

jsonParsed, _ := gabs.ParseJSON([]byte(`{"array":[ {"value":1}, {"value":2}, {"value":3} ]}`))

fmt.Println(jsonParsed.Path("array.value").String())