python - 如何展平嵌套的 JSON 文件以检索预期的字段
问题描述
我有以下 JSON 文件:
[
{'docType': 'custom',
'fields':
{
'general_info': None,
'power': 20,
'safety':
{
'boundingBox': [2.375,9.9,4.98,9.9,4.98,10.245,2.375,10.245],
'confidence': 0.69,
'page': 22,
'text': 'bla-bla-bla',
'type': 'string',
'valueString': 'bla-bla-bla'
},
'replacement':
{
'boundingBox': [2.505,2.51,2.54,2.51,2.54,3.425,2.505,3.425],
'confidence': 0.262,
'page': 7,
'text': 'bla-bla-bla',
'type': 'string',
'valueString': 'bla-bla-bla'
},
'document_id': 'x123'
}
}
]
我想遍历所有field
值并text
从嵌套字段中提取。预期结果如下:
{
'labels':
{
'general_info': None,
'power': 20,
'safety': 'bla-bla-bla',
'replacement': 'bla-bla-bla',
'document_id': 'x123'
}
}
如何展平我的 JSON 文件并获得预期的结果?
这是我到目前为止所尝试的:
import json
json_object = json.load(raw_json)
fields = {}
for field in json_object:
for attribute, value in field.items():
fields[attribute] = value
fields_json = json.dumps(fields, indent = 4)
但是,我不知道如何递归地进入嵌套字段
解决方案
你可以写一个递归函数。当值是字典时,它应该调用自己。
这是一个例子。
def flatten_fields(d):
out = {}
for k, v in d.items():
if isinstance(v, dict):
out[k] = flatten_fields(v)
elif k == 'text':
return v
elif isinstance(v, list):
continue
else:
out[k] = v
return out
要运行它,您可以遍历json_object
. 上面只有一个示例,但方法如下:
labels = []
for d in json_object:
labels.append({'labels': flatten_fields(d.get('fields', {}))})
labels
# returns:
[{'labels': {'general_info': None,
'power': 20,
'safety': 'bla-bla-bla',
'replacement': 'bla-bla-bla',
'document_id': 'x123'}}]
推荐阅读
- mysql - $GOPATH/go.mod 存在但不应该在 Docker 上
- sqlite - 如何在 Xamari Form 中使用 SQLite 为同一个表创建两个外键
- pytorch - 当我验证输入为非 0 维时,为什么 nn.CrossEntropyLoss 会抛出“TypeError:在 0-d 张量上迭代”?
- excel - 网站在网络抓取期间未识别多个表
- python - 使用语音识别器中的麦克风时获取 AttributeError:__enter__
- php - 在将项目移动到列表之前检查所有列表中的重复项
- python - 有时无法导入 NumPy
- javascript - 如何在我的 JavaScript 中添加搜索功能?
- php - 为什么我的其他输入值不会插入到我的数据库中?
- r - 如何在R中提取多词?