我希望在这个JSON字典中搜索具有值为“Controller”的键“title”的子节点。然后,当找到时,我希望从这个孩子的关键“tid”中获取值。在下面的示例字典中,值为“7”。
孩子“控制器”可能会在树中的不同深度结束。
这是JSON。我一直在寻找一种迭代未知深度儿童的方法。
{
"users": {
"fredrik": {
"J1312160092": {
"data": {
"somedata": 0,
"someotherdata": [36, 1, 2, 0]
},
"children": [
{ "#": "T1",
"children": [
{ "#": "T2",
"children": [
{ "#": "T3",
"children": [
{ "#": "T4",
"children": [],
"data": {
"tid": 4,
"title": "Pre-job: Sub-task 1",
"state": "+D",
"cids": [1]
}
},
{ "#": "T5",
"children": [],
"data": {
"tid": 5,
"title": "Pre-job: Sub-task 2",
"state": "+D",
"cids": [2]
}
}
],
"data": {
"serialsubtasks": 0,
"tid": 3,
"title": "Pre-job",
"state": "+A",
"cids": [3]
}
},
{ "#": "T6",
"children": [
{ "#": "T7",
"children": [
{ "#": "T8",
"children": [],
"data": {
"tid": 8,
"title": "Master: Frame 1-1, camera(s): camera1, camera2",
"state": "-B",
"cids": [4]
}
}
],
"data": {
"tid": 7,
"title": "Controller",
"state": "-B",
"cids": [5]
}
},
{ "#": "T9",
"children": [
{ "#": "T10",
"children": [],
"data": {
"tid": 10,
"title": "Frame 1",
"state": "-B",
"cids": [6]
}
},
{ "#": "T11",
"children": [],
"data": {
"tid": 11,
"title": "Frame 2",
"state": "-B",
"cids": [7]
}
},
{ "#": "T12",
"children": [],
"data": {
"tid": 12,
"title": "Frame 3",
"state": "-B",
"cids": [8]
}
}
],
"data": {
"tid": 9,
"title": "Frame holder",
"state": "-B"
}
}
],
"data": {
"serialsubtasks": 0,
"tid": 6,
"title": "Frame job",
"state": "-B"
}
}
],
"data": {
"serialsubtasks": 1,
"tid": 2,
"title": "Blocker",
"state": "-B"
}
}
],
"data": {
"tid": 1,
"title": "Main job",
"state": "-B"
}
}
]
}
}
},
"recordlimit": {"limit": 1, "truncated": 0}
}
答案 0 :(得分:2)
递归你的json并寻找控制器。这段代码应该与json的结构无关,横跨子列表和字典,并产生第一个字典的tid,其中包含一个值为“Controller”的键“title”。
def findTid (j):
if isinstance (j, dict):
if 'title' in j and j ['title'] == 'Controller':
return j ['tid']
for v in j.values ():
r = findTid (v)
if r: return r
if isinstance (j, list):
for e in j:
r = findTid (e)
if r: return r
使用您的数据调用它返回'7'。
答案 1 :(得分:0)
我认为你想要一个递归函数:
def find(tree):
if tree["data"]["title"] == "Controller":
return tree["data"]["tid"]
if "children" in tree:
return
for child in tree["children"]:
f = find(child)
if f:
return f
答案 2 :(得分:0)
尝试使用正则表达式和 re.findall 与您在树中寻找的模式。