登录
首页 >  Golang >  Go问答

在复杂的 JSON 数据结构中查找指定的键

来源:stackoverflow

时间:2024-03-23 17:06:27 454浏览 收藏

在复杂且嵌套的 JSON 数据结构中查找特定键是一个常见的挑战。本文探讨了一种递归函数,用于遍历 JSON 文档并搜索给定的键。虽然该函数有效,但对于包含大量条目的 JSON,其复杂性可能变得难以管理。本文还提出了使用 JSONPath 等工具作为替代解决方案,该工具可以高效地从大型 JSON 文档中提取数据,而无需创建自定义结构。

问题内容

我有一个带有树深度嵌套对象和对象列表的 json。我想在这样的 json 中搜索精确的键。

{
    "obj" : {
        "$ref" : "coll", 
        "$id" : objectid("5e37f7907303f206c87eb7d3"), 
        "$db": "db"
    }
    "objlist" : [
            {
                "$ref" : "coll", 
                "$id" : objectid("5ec57e3a72b4e11ac7239748"), 
                "$db": "db"
            }
            {
                "$ref" : "coll", 
                "$id" : objectid("5e26e09eb0d1301b1931e1aa"), 
                "$db": "db"
            }   ],
    "nestedobj" : {
            "created" : isodate("2020-05-20t19:00:10.609z"),
            "empty" : {

            },
            "obj" : {
                "$ref" : "coll", 
                "$id" : objectid("5ec57e3a72b4e11ac723974b"), 
                "$db": "db"
            }
            "obj" : {
                "$ref" : "coll", 
                "$id" : objectid("5f7206393c7b9885bc80607d"), 
                "$db": "db"
            }   },
    "obj" : {
            "x" : "xxx",
            "y" : "yyy",
            "z" : "zzz"
    },
    "nestedobjlist" : [
            {
                    "created" : isodate("2020-05-14t12:35:14.340z"),
                    "updated" : isodate("2020-05-14t12:35:14.340z"),
                    "obj" : {
                        "$ref" : "coll", 
                        "$id" : objectid("5e37f7907303f206c87eb7d3"), 
                        "$db": "db"
                    }
                    "x" : "xxx",
                    "obj" : {
                        "$ref" : "coll", 
                        "$id" : objectid("5ebd3ae7d5d9e5502a48cb23"), 
                        "$db": "db"
                    }           },
            {
                    "created" : isodate("2020-05-14t12:35:14.340z"),
                    "updated" : isodate("2020-05-14t12:35:14.340z"),
                    "obj" : {
                        "$ref" : "coll", 
                        "$id" : objectid("5e37f7907303f206c87eb7d3"), 
                        "$db": "db"
                    }
                    "x" : "xxx",
                    "obj" : {
                        "$ref" : "coll", 
                        "$id" : objectid("5f7206393c7b9885bc80607d"), 
                        "$db": "db"
                    }           }
    ],
    "empty" : {

    },
    "created" : isodate("2020-01-21t10:33:50.378z"),
    "x" : "xxx",
    "bool" : false,
    "int" : 0
    ...
}

我已经编写了这个有效的递归函数,但是对于大量条目来说,复杂性是否会变得太大?有没有更好的解决方案来遍历 json?

func recurs(doc bson.d, key string) {
    for _, k := range doc {
        switch e := k.value.(type) {
        case primitive.d:
            if len(e) > 0 && e[0].key == key {
                fmt.println(e)
            } else {
                recurs(e)
            }
        case primitive.a:
            for _, r := range e {
                if len(r.(primitive.d)) > 0 && r.(primitive.d)[0].key == key {
                    fmt.println(r)
                } else {
                    recurs(r.(primitive.d))
                }
            }
        }
    }
}

我检索 mongodb 数据库中的数据,然后操作 bson 中的文档,其中:

type E struct {
    Key   string
    Value interface{}
}
type D []E
type A []D

解决方案


我不确定 BSON,但我已经使用 https://github.com/PaesslerAG/jsonpath 等工具从大型 JSON 文档中提取值,而我不想在其中创建一组结构。 jsonpath 的工作方式类似于 XPath,您可以将 JSON 解析为通用接口{},然后给出一个表达式来提取所需的节点。

本篇关于《在复杂的 JSON 数据结构中查找指定的键》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>