我有一个大的嵌套JSON (下面的结构片段),我正在为键FLOODING、date和filename提取键/值对。但是,所有字典都没有用于filename的键/值对,我希望在提取之前或提取时省略这些字典。
74': { '18': { 'FLOODING': True,
'FULL-DATA-COVERAGE': True,
'date': '2019-05-03'},
'19': { 'FLOODING': True,
'FULL-DATA-COVERAGE': True,
'date': '2019-05-06'},
'2': { 'FLOODING': False,
'FULL-DATA-COVERAGE': True,
'date': '2019-03-02',
'filename': 'S2_2019-03-02'},
'20': { 'FLOODING': True,
'FULL-DATA-COVERAGE': False,
'date': '2019-05-08'},
…我有一个函数(参见下面的代码),它很好地为所需的键输入提取信息。当JSON中的所有字典都有相同的键时,这将导致提取长度相等的数组。当一些字典缺少钥匙时,它就不会了。因此,我想略去缺少钥匙的字典,但却很难做到这一点。在提取信息并将JSON与省略的字典一起保存为新文件之前,很可能会出现这种遗漏。
def json_extract(obj, key):
"""Recursively fetch values from nested JSON."""
arr = []
def extract(obj, arr, key):
"""Recursively search for values of key in JSON tree."""
if isinstance(obj, dict):
for k, v in obj.items():
if isinstance(v, (dict, list)):
extract(v, arr, key)
elif k == key:
arr.append(v)
elif isinstance(obj, list):
for item in obj:
extract(item, arr, key)
return arr
values = extract(obj, arr, key)
return values发布于 2022-10-13 17:48:54
看起来您的数据有一些固定的结构,但是一般情况下的递归代码可以处理任何数据结构,不管数据块和列表嵌套得有多深。缺点是它不知道它目前在数据结构中的位置。
如果我的假设是正确的,那么一个简单的非递归代码可以遍历obj。
for d1 in obj.values(): # top level is a dict
for d2 in d1.values(): # level below is also a dict
if 'filename' not in d2:
continue # disregard this one, it is incomplete
if key in d2:
arr.append(d2[key]) # extract valuehttps://stackoverflow.com/questions/74059205
复制相似问题