将复杂的JSON转换为Golang中的地图
问题描述:
如何将复杂的JSON对象转换为具有golang中所有正确类型的地图。我完全必须做一些典型的Golang事情吗?我在那里创建一个结构体,其中包含我知道的字段,或者是否有一种通用的方法来获取所有正确类型的字段?将复杂的JSON转换为Golang中的地图
这里是我想变成地图的JSON的示例:
{
"people": [
{
"diffs": [
77
],
"original": {
"name": "Nick",
"active": "Active",
"email": "[email protected]"
},
"id": "21"
}
]
}
答
你可以建立与一种类型的断言开关递归函数来键入断言JSON数组的多维地图或平坦的地图。不幸的是,你的多维地图会很快变得复杂。如果你有一个嵌套的JSON数组,例如“map [string] map [string] map [string] string”),我经常需要映射至少几个维度。人“。
如果您尝试拼合嵌套的JSON数组,您的键将会重叠(即,您只能使用“名称”键一次)。您可以标记键 - 例如“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": "ni[email protected]"
},
"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())
欢迎使用静态类型语言。使用'json'包,你总是可以解组成一个'map [string] interface {}',但这通常不是你真正想要的。 – RayfenWindspear