如何将复杂的JSON对象转换为golang中具有所有正确类型的地图。我是否绝对需要做一个典型的Golang事情,我创建一个结构,其中包含我知道的字段,或者是否有一种通用的方法来获取所有正确类型的字段?
以下是我想要转换为地图的JSON示例:
{
"people": [
{
"diffs": [
77
],
"original": {
"name": "Nick",
"active": "Active",
"email": "nick@example.com"
},
"id": "21"
}
]
}
答案 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())