有助于理解 json(dict) 结构的函数

2025-03-26 09:10:00
admin
原创
26
摘要:问题描述:我还没有找到一种方法来做到这一点。假设我收到一个这样的 JSON 对象:{'1_data':{'4_data':[{'5_data':'hooray'}, {'3_data':'hooray2'}], '2_data':[]}} 很难立即说,我应该如何从3_data 键中获取值:data['1_da...

问题描述:

我还没有找到一种方法来做到这一点。假设我收到一个这样的 JSON 对象:

{'1_data':{'4_data':[{'5_data':'hooray'}, {'3_data':'hooray2'}], '2_data':[]}}

很难立即说,我应该如何从3_data 键中获取值:data['1_data']['4_data'][1]['3_data']

我知道pprint,这有助于理解结构。但有时数据量很大,需要时间

有什么方法可以帮助我解决这个问题?


解决方案 1:

这是一组递归生成器,可用于搜索由字典和列表组成的对象。find_key生成一个元组,其中包含字典键的列表和指向您传入的键的列表索引;该元组还包含与该键关联的值。因为它是一个生成器,所以如果对象包含多个匹配的键(如果需要),它将找到所有匹配的键。

def find_key(obj, key):
    if isinstance(obj, dict):
        yield from iter_dict(obj, key, [])
    elif isinstance(obj, list):
        yield from iter_list(obj, key, [])

def iter_dict(d, key, indices):
    for k, v in d.items():
        if k == key:
            yield indices + [k], v
        if isinstance(v, dict):
            yield from iter_dict(v, key, indices + [k])
        elif isinstance(v, list):
            yield from iter_list(v, key, indices + [k])

def iter_list(seq, key, indices):
    for k, v in enumerate(seq):
        if isinstance(v, dict):
            yield from iter_dict(v, key, indices + [k])
        elif isinstance(v, list):
            yield from iter_list(v, key, indices + [k])

# test

data = {
    '1_data': {
        '4_data': [
            {'5_data': 'hooray'},
            {'3_data': 'hooray2'}
        ], 
        '2_data': []
    }
}

for t in find_key(data, '3_data'):
    print(t)

输出

(['1_data', '4_data', 1, '3_data'], 'hooray2')

要获取单个键列表,您可以将其传递find_keynext函数。如果您想使用键列表来获取关联值,则可以使用一个简单的for循环。

seq, val = next(find_key(data, '3_data'))
print('seq:', seq, 'val:', val)

obj = data
for k in seq:
    obj = obj[k]
print('obj:', obj, obj == val)

输出

seq: ['1_data', '4_data', 1, '3_data'] val: hooray2
obj: hooray2 True

如果键可能缺失,则给出next适当的默认元组。例如:

seq, val = next(find_key(data, '6_data'), ([], None))
print('seq:', seq, 'val:', val)
if seq:
    obj = data
    for k in seq:
        obj = obj[k]
    print('obj:', obj, obj == val)

输出

seq: [] val: None

请注意,此代码适用于 Python 3。要在 Python 2 上运行它,您需要替换所有yield from语句,例如替换

yield from iter_dict(obj, key, [])

for u in iter_dict(obj, key, []):
    yield u

工作原理

要理解此代码的工作原理,您需要熟悉递归和 Python生成器。您可能还会发现此页面很有帮助:了解 Python 中的生成器;网上还有各种 Python 生成器教程。

json.load或返回的 Python 对象json.loads通常是一个字典,但也可以是一个列表。我们将该对象find_key作为obj参数传递给生成器,以及key我们想要定位的字符串。find_key然后根据需要调用iter_dictiter_list,将对象、键和一个空列表传递给它们indices,该列表用于收集字典键和指向我们想要的键的列表索引。

iter_dict`d在其字典参数的顶层迭代每个 (k, v) 对。如果k匹配我们要查找的键,则indices生成当前列表并将k相关值附加到该列表。由于iter_dict是递归的,因此生成的 (索引列表,值) 对将传递到上一级递归,最终到达find_key调用的代码find_key。请注意,这是我们递归的“基本情况”:它是代码的一部分,用于确定此递归路径是否指向我们想要的键。如果递归路径从未找到与我们要查找的键匹配的键,则该递归路径将不会添加任何内容,indices`并且它将终止而不生成任何内容。

如果当前v是字典,那么我们需要检查它包含的所有 (键,值) 对。我们通过对 进行递归调用来实现iter_dict这一点,传递v其起始对象和当前indices列表。如果当前v是列表,我们改为调用iter_list,并传递相同的参数。

iter_list工作原理类似,iter_dict只是列表没有任何键,它只包含值,所以我们不执行k == key测试,我们只是递归到原始列表包含的任何字典或列表。

该过程的最终结果是,当我们迭代时,find_key我们得到 (索引,值) 对,其中每个indices列表都是字典键和列表索引的序列,这些序列成功终止于具有我们所需键的字典项,并且value是与该特定键关联的值。

如果您想查看此代码的其他使用示例,请参阅如何修改嵌套 Json 的键和如何从 python 中的字典中选择深度嵌套的键:值。

还请看一下我的新的、更简化的show_indices功能。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2482  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1533  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   0  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   0  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用