Python:循环嵌套的JSON,深度未知

时间:2017-11-08 12:13:44

标签: python json

我有一个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'])

Link to Code and Sample JSON Response I'm parsing

1 个答案:

答案 0 :(得分:1)

您有一个嵌套结构 - 实际上是一个树,由可以拥有子节点的节点组成,您的任务是:

  1. 从根遍历树
  2. 为每个节点做一些工作,
  3. 遍历每个子节点。
  4. 这是递归的最经典案例。

    在通用术语中,我们冷定义递归函数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)
    
相关问题