首页 > 解决方案 > 解析多个 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] 并附加到同一文件。

这在基本层面上有效,但我正在研究优化它的可能性。我期待每天有大量(数百个),并且想知道我是否可以在没有太多循环的情况下扩大规模。

标签: pythonjson

解决方案


首先,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 并在循环内一次又一次地编写整个文本?


推荐阅读