解析多个JSON对象以标准化嵌套的子部分

时间:2018-07-18 13:45:16

标签: 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]并追加到同一文件

这在基本水平上可行,但我正在研究对其进行优化的可能性。我每天的工作量很大(十万个),我想知道是否可以在没有太多循环的情况下进行扩展。

1 个答案:

答案 0 :(得分:0)

首先,JSON操作通常很昂贵。

您正在使用range生成数字列表,现在考虑一下,如果您输入的数组长度为10000,它将生成所有这些数字,然后对其进行迭代。

您可以删除if条件以检查“ history”键,而只需使用如下所示的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并在循环内一次又一次地写入整个文本?