Arrays Golang在嵌套JSON中解组特定对象
使用GO中的静态属性名称来解组大型JSON的特定部分的最佳实践是什么 我的JSON映射看起来像Arrays Golang在嵌套JSON中解组特定对象,arrays,json,go,unmarshalling,Arrays,Json,Go,Unmarshalling,使用GO中的静态属性名称来解组大型JSON的特定部分的最佳实践是什么 我的JSON映射看起来像 { "top_view" : { "@self" : "https://generic.com", "graph" : { "nodes" : [ { } ], "relations"
{
"top_view" : {
"@self" : "https://generic.com",
"graph" : {
"nodes" : [ { } ],
"relations" : [ { } ]
},
"view_status" : {}
}
}
我只需要检索节点数组
这是我到目前为止得到的
我只知道如何解组节点部分,但我不知道如何告诉Go只开始解组该对象,因此如果我输入整个JSON树,代码将无法工作。
请告知,谢谢 您可以解组任何JSON数据,而无需在
go
代码中定义任何具体类型。使用类型断言
和类型开关
向下搜索刚刚解组的数据
下面是使用上述概念解决问题的工作示例。您可能需要根据您的需求进一步完善此基础,但基本概念保持不变:
package main
import (
"encoding/json"
"fmt"
"log"
)
func main() {
jsonResponse := `{
"top_view" : {
"@self" : "https://generic.com",
"graph" : {
"nodes" : [ {
"@self" : "https://generic.com:443",
"id" : "1;;45d554600be28ee49c99d26e536225ea;;461ff354437881f6b5973d4af366b91c;;4c0f2cc8e29a4fe09240b2a0c311508d",
"ci" : {
"id" : "4c0f2cc8e29a4fe09240b2a0c311508d",
"name" : "NOICE",
"type" : "ci_collection",
"type_label" : "CiCollection",
"icon" : "/logical_group_32.svg"
},
"has_children" : true
}, {
"@self" : "https://generic.com:443hjkhk",
"id" : "1;;45d554600be28ee49c99d26e536225ea;;4e22910a478bf6939aed36fef22dc79e;;4a7788eeecbbeee3a8bb3189ba67f269",
"ci" : {
"id" : "4a7788eeecbbeee3a8bb3189ba67f269",
"name" : "NOTNOICE",
"type" : "ci_collection",
"type_label" : "CiCollection",
"icon" : "/logical_group_32.svg"
},
"has_children" : true
}, {
"@self" : "https://generic.com:443/fghfgh",
"id" : "1;;45d554600be28ee49c99d26e536225ea;;461ff354437881f6b5973d4af366b91c;;4c0f2cc8e29a4fe09240b2a0c311508d;;40b8b314821d01ac874f7209c228ab8f",
"ci" : {
"id" : "40b8b314821d01ac874f7209c228ab8f",
"name" : "NOICE",
"type" : "ci_collection",
"type_label" : "CiCollection",
"icon" : "/logical_group_32.svg"
},
"has_children" : true
}, {
"@self" : "https://generic.com:443/gfhgh",
"id" : "1;;45d554600be28ee49c99d26e536225ea;;4a208e0deee006668bb3cfab6541a869;;4bd30d48bc1c81b398e17435ba519f2d;;4a1c671cefd3b5b9931b4312382ff2e4",
"ci" : {
"id" : "4a1c671cefd3b5b9931b4312382ff2e4",
"name" : "AAA",
"type" : "ci_collection",
"type_label" : "CiCollection",
"icon" : "/logical_group_32.svg"
},
"has_children" : true
} ],
"relations" : [ { } ]
},
"view_status" : {}
}
}`
var res interface{}
err := json.Unmarshal([]byte(jsonResponse), &res)
if err != nil {
log.Fatal(err)
}
parseArbitoryJSONObject(res)
}
func parseArbitoryJSONObject(jsonObject interface{}) {
data := jsonObject.(map[string]interface{})
for k, v := range data {
switch val := v.(type) {
case string:
fmt.Println(k, "is string:", val)
case float64:
fmt.Println(k, "is float64", val)
case bool:
fmt.Println(k, "is boolean", val)
case []interface{}:
fmt.Println(k, "is an array:")
for i, u := range val {
fmt.Println(i, u)
}
case map[string]interface{}:
fmt.Println(k, "is an map[string]interface{}:")
parseArbitoryJSONObject(val)
default:
fmt.Println(k, "is of a type I don't know how to handle")
}
}
}
这里的json.Unmarshal
使用的是可以保存任何值的空接口。函数parseArbitoryJSONObject()
正在使用类型断言
来帮助从未编组的数据中提取值
类型开关
是您可能需要进一步放置或修改逻辑以从解组JSON对象获取所需项的地方
以下是go Playery代码段链接,供您参考:
这是一种方法:
定义一个显示节点路径的结构。您可以跳过JSON中不感兴趣的成员。例如:
type Whole struct {
TopView struct {
Self string `json:"@self"`
Graph struct {
Nodes []Node `json:"nodes"`
} `json:"graph"`
} `json:"top_view"`
}
然后封送节点
var whole Whole
err := json.Unmarshal([]byte(jsonResp), &whole)
以下是工作代码:
我认为这是不可能的,因为必须从上到下解析树。但是,您可以采用另一种方法,即保持节点
键MarshelledClare Go类型具有获得所需零件所需的最小结构。解组JSON文档并选择所需的部分var data=struct{TopView struct{Self struct{Graph Graph}`json:@Self“`}`json:“top_view”`}
在我看来,最好的方法就是将其解组到匹配的结构中,然后忽略不需要的部分。例如:谢谢,我喜欢这个优雅的解决方案!