如何解决如何解决jsonb中的递归嵌套树?
所以我有一棵这样的扁平树:
[{
aid: "id3"
atype: ""
data: ["id1","id2"]
},{
aid: "id1"
atype: ""
data: ["id3",{
aid: "id2"
atype: ""
bdata: {aid: "id4",atype: "nested",data: ["id1","id3"]}
data: []
}]
我想收集那棵树并用递归循环将 id 解析为数据,就像这样(假设我们从 "id3"
开始):
{
aid: "id3"
payload: "1"
data: [
"id1":{
aid: "id1"
atype: ""
data: ["id3":Null,"id2":Null]
},"id2":{
aid: "id2"
atype: ""
bdata: {aid: "id4",data: ["id1":Null,"id3":Null]}
data: []
}]
}
这样我们就可以进行广度优先搜索,并在第一次进入时将某些字段解析为 "value": "object with that field"
和 "value": Null
那么如何在 Postgres JSONb\ JSON 中将这样的列表实现到一棵树上?
我知道有人可以使用 PL/Python 之类的东西来做到这一点,但我没能看到一个 PL/Python 函数示例,它可以执行诸如不将所有 JSON 记录放入 ram 之类的事情...
{'id1': {'aid': 'id1','atype': '','data': ['id3','id2']},'id2': {'aid': 'id2','bdata': {'aid': 'id4','atype': 'nested','data': ['id1','id3']},'data': []},'id3': {'aid': 'id3','id2']}}
对我来说不是真的有用 - 所以我需要一棵真正的树。
解决方法
你的方法有问题。
让我们考虑以下 json。
{
"aid": "id3","atype": "","data": ["id1","id2"]
},{
"aid": "id4","id2"]
}
这里,id4的id1和id2数据需要再次复制,造成大量重复数据。
取而代之的是,将您的数据转换为字典。 您可以通过调用 id 来访问数据,例如“id1”、“id2”等。
data_map = {}
for data in data_array:
data_map.__setitem__(data['aid'],data)
以下将是示例输出。
{
"id3": {
"aid": "id3","data": [
"id1","id2"
]
}
这样您就可以直接访问 id 并且结构中没有重复项。
完整的示例代码
import json
json_data = '''
[
{
"aid": "id3",{
"aid": "id1","data": ["id3",{
"aid": "id2","bdata": {"aid": "id4","atype": "nested","id3"]},"data": []
}
]
'''
data_array = json.loads(json_data)
data_map = {}
for data in data_array:
data_map.__setitem__(data['aid'],data)
print(data_map)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。