Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Golang在嵌套JSON中解组特定对象_Arrays_Json_Go_Unmarshalling - Fatal编程技术网

Arrays Golang在嵌套JSON中解组特定对象

Arrays Golang在嵌套JSON中解组特定对象,arrays,json,go,unmarshalling,Arrays,Json,Go,Unmarshalling,使用GO中的静态属性名称来解组大型JSON的特定部分的最佳实践是什么 我的JSON映射看起来像 { "top_view" : { "@self" : "https://generic.com", "graph" : { "nodes" : [ { } ], "relations"

使用GO中的静态属性名称来解组大型JSON的特定部分的最佳实践是什么

我的JSON映射看起来像

{
    "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”`}
在我看来,最好的方法就是将其解组到匹配的结构中,然后忽略不需要的部分。例如:谢谢,我喜欢这个优雅的解决方案!