python - 解析多个 JSON 对象以规范嵌套的子部分
问题描述
我有传入的 JSON 文件,其中包含元素 [a,b,c] 和一个包含具有相同元素 [a,b,c] 的嵌套 JSON 的历史元素。历史元素中可能有多个嵌套条目,也可能有一个或没有,但下面是数据外观的示例。这是一个例子:
{
"a": "1",
"b": "2",
"history": [
{
"a": "11",
"b": "22",
"c": "33"
},
{
"a": "111",
"b": "222",
"c": "333"
}
],
"c":"3"
}
{
"a": "a1",
"b": "b1",
"history": [
{
"a": "a12",
"b": "b12",
"c": "c12"
}
],
"c":"c1"
}
我想规范化这个 JSON,让一切看起来像{"a": "111", "c": "333", "b": "222"}{"a": "111", "c": "333", "b": "222"}{"a": "1", "c": "3", "b": "2"}
我构建了一个简单的脚本来读取文件并执行 json.loads() 并读取“histroy”元素。
import json
j1 = json.loads(j1)
if "history" in j1.keys():
j1_hist = j1["history"]
with open('/normalzied_json_output', 'w') as f:
for i in range(len(j1_hist)):
f.write(json.dumps(j1_hist[1]))
j1.pop('history', None)
f.write(json.dumps(j1))
基本上将所有历史记录读入一个变量(如果存在)并打开一个输出文件(normalzied_json_output),并将每个嵌套的 json 条目读入输出文件并仅提取 [a,b,c] 并附加到同一文件。
这在基本层面上有效,但我正在研究优化它的可能性。我期待每天有大量(数百个),并且想知道我是否可以在没有太多循环的情况下扩大规模。
解决方案
首先,JSON 操作通常很昂贵。
而且您正在使用生成数字列表的范围,现在考虑一下,如果您的传入数组长度为 10000,它将生成所有这些数字然后对其进行迭代。
您可以删除 if 条件以检查“历史记录”键,只需使用 get 方法,如下所示:
import json
with open(filename, 'r') as f:
j1= json.load(f)
with open('/normalzied_json_output', 'w') as f:
for item in j1.get("history", []):
f.write(json.dumps(item))
j1.pop('history', None)
f.write(json.dumps(j1))
顺便说一句,您的代码没有做您想做的事情,为什么您只从历史中读取第一个索引值?为什么要在循环内使用 pop 并在循环内一次又一次地编写整个文本?
推荐阅读
- c - 仅使用'if'在c中从大到小排列5位数字
- plotly - xlmhg 2.5.4 有要求 plotly>=3,但你将拥有不兼容的 plotly 2.7.0
- css - 更改特定路径的 svg 颜色
- r - 如何将向量粘贴到 R 中不是 NA 的数据框列的空单元格中?
- javascript - 在 Vue 应用程序之外使用 Vue 电话号码组件
- visual-c++ - 如何使用其他预处理器指令定义宏?
- postgresql - 忽略 Postgres 插入中不存在的列?(用于开发目的)
- javascript - JavaScript 警报未显示在浏览器页面中,但显示在屏幕右侧
- marklogic-corb - MarkLogic CORB - 如何在运行 corb 时避免超时
- matlab - matlab deploytool 生成的独立应用程序/使用 OPC 编译在主机系统中失败