如何从JSON递归地在Python中添加字典?

1 投票
3 回答
993 浏览
提问于 2025-04-17 14:18

亲爱的Stackoverflow成员们,

我有一个JSON数组,它大致包含以下内容:

{
    {
        'Name': 'x',
        'Id': 'y',
        'Unsusedstuff' : 'unused',
        'Unsusedstuff2' : 'unused2',
        'Children': []
    },
    {   'Name' : 'xx',
        'Id': 'yy',
        'Unsusedstuff' : 'unused',
        'Unsusedstuff2' : 'unused2',
        'Children': [{
            'Name': 'xyx',
            'Id' : 'yxy',
            'Unsusedstuff' : 'unused',
            'Unsusedstuff2' : 'unused2',
            'Children: []
        }

你们大概明白我的意思了。我想用下面的代码在Python列表中模拟这个结构,只提取id和名称:

names = []
def parseNames(col):
    for x in col:
        if(len(x['Children'])> 0):
            names.append({'Name' : x['Name'], 'Id' : x['Id'], 'Children' : parseNames(x['Children'])})
        else:
            return {'Name' : x['Name'], 'Id' : x['Id']}

但是,它似乎只返回了第一个“根”元素和第一个嵌套文件夹,并没有遍历所有的内容。

我该如何解决这个问题呢?

问候,

Mats

3 个回答

0

你可以用下面的方式来解析一个Json对象:

import json
response = json.loads(my_string)

现在,response就是一个字典,里面包含了每个Json对象的键。

2

看看这个

def parseNames(col):
    for x in col:
        if(len(x['Children'])> 0):
            a = [{
                'Name' : x['Name'],
                'Id' : x['Id'],
                'Children' : x['Children'][0]['Children']
                }]
            parseNames(a)
        names.append({'Name' : x['Name'], 'Id' : x['Id']})
    return names

我得到的输出是

[{'Name': 'x', 'Id': 'y'}, {'Name': 'xx', 'Id': 'yy'}, {'Name': 'xx', 'Id': 'yy'}]
3

我理解你的意思是,你想把这个树结构转换成一个只包含 Id、Name 和 Children 的节点树。这样的话,我会把这个过程看作是“清理节点”。

清理一个节点的方法是:

  1. 创建一个新节点,包含原节点的 Name 和 Id。
  2. 把新节点的 Children 设置为原节点子节点的清理版本。(这就是递归调用。)

在代码中,这样写:

def clean_node(node):
    return {
        'Name': node['Name'],
        'Id': node['Id'],
        'Children': map(clean_node, node['Children']),
    }

>>> print map(clean_node, data)
[{'Name': 'x', 'Children': [], 'Id': 'y'}, {'Name': 'xx', 'Children': [{'Name': 'xyx', 'Children': [], 'Id': 'yxy'}], 'Id': 'yy'}]

我发现把递归问题分解成这样处理会更简单——如果试图使用全局变量,简单的事情很快就会变得让人困惑。

撰写回答