我有一个JSON响应返回,它具有一般结构,但是,它们可以是N个嵌套结果('队列')。我试图理解如何循环遍历可能非常深入的所有嵌套结果。我添加了一个带有长JSON响应的饰品链接。基本上,有N个叶子队列可以没有限制,所以我怎样才能保持更深的循环?现在我被卡住了2级。
import json
with open('sample_response.json') as data_file:
theJSON = json.load(data_file)
queuesJson = theJSON['scheduler']['schedulerInfo']['queues']['queue']
def get_leaf_queue_info (childQueue):
for queue in childQueue:
print ('nested +' + queue.get('queueName'))
for queue in queuesJson:
print (queue.get('queueName'))
if (len(queue['queues']['queue']) > 1):
get_leaf_queue_info(queue['queues']['queue'])
答案 0 :(得分:1)
您有一个嵌套结构 - 实际上是一个树,由可以拥有子节点的节点组成,您的任务是:
这是递归的最经典案例。
在通用术语中,我们冷定义递归函数traverse()
,如下所示:
def traverse(node):
do_work(node)
for child in children_of(node):
traverse(child)
这将访问每个节点并对其进行一些处理。由于它是如此通用,它可以在任何树上工作,假设do_work()
和children_of()
是
定义
为了删除那个隐式依赖项并使traverse()
函数真正通用,让我们明确它:
def traverse(node, do_work, children_of):
do_work(node)
for child in children_of(node):
traverse(child)
现在,对于您的情况,获取任何节点的子节点的函数将如下所示:
def sub_queues(queue):
return queue.get('queues', {}).get('queue', [])
执行某项工作的功能可能如下所示:
def print_name(queue):
print(queue.get('queueName'))
我们可以这样称呼它:
root = data['scheduler']['schedulerInfo']
traverse(root, print_name, sub_queues)
一个traverse()
函数,通知工作者当前的递归深度(例如,如果你想打印带缩进的东西很有用),并在worker函数返回False
时取消递归这样:
def traverse(node, do_work, children_of):
continue_working = True
def work(node, depth=0):
if continue_working:
result = do_work(node, depth=depth)
if continue_working and result == False:
continue_working = False
return
for child in children_of(node):
work(child, depth + 1)
work(node)