问题描述
我有一个树深度嵌套对象和对象列表的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解析为通用接口{},然后给出一个表达式以提取所需的节点。