在嵌套的复杂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","$db": "db"
                    }
                    "x" : "xxx","$id" : ObjectId("5ebd3ae7d5d9e5502a48cb23"),"$db": "db"
                    }           },{
                    "created" : ISODate("2020-05-14T12:35:14.340Z"),"$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解析为通用接口{},然后给出一个表达式以提取所需的节点。