Python迭代两个相似但高度嵌套的JSON对象

时间:2017-05-27 00:34:31

标签: python json replace python-requests generator

我有一个巨大的JSON对象“人”记录...就像这样 - 通过使用请求的API调用获取:

{
    people: [
        { 
            foo: { key: value, ...},
            bar: { key: value, ...},
            person: { name: Harry, ...},
            baz: { key: value, ...}
        },
        { 
            foo: { key: value, ...},
            bar: { key: value, ...},
            person: { name: Sally, ...},
            baz: { key: value, ...}
        },
        {
            ... # many more records
        }
    ]
}

第二次调用相同的API会生成其他形式的记录,并且标记完全相同......

{
    people: [
        { 
            foo: { key: value, ...},
            bar: { key: value, ...},
            person: { name: Jack, ...},
            baz: { key: value, ...}
        },
        { 
            foo: { key: value, ...},
            bar: { key: value, ...},
            person: { name: Jill, ...},
            baz: { key: value, ...}
        },
        {
            ... #many more records
        }
    ]
}

我需要将这些记录连接到一个文件中(或者说,解析和操作数据以便最终插入到数据库中)。我需要保留所有记录...我不是要覆盖JSON对象中的任何单个记录。

我很容易将第二组记录附加到包含第一组的文件中......但是我得到了:

{
    people: [
        { 
            foo: { key: value, ...},
            bar: { key: value, ...},
            person: { name: Harry, ...},
            baz: { key: value, ...}
        },
        { 
            foo: { key: value, ...},
            bar: { key: value, ...},
            person: { name: Sally, ...},
            baz: { key: value, ...}
        },
        {
            ... #many more records
        }
    ]
}
{
    people: [
        { 
            foo: { key: value, ...},
            bar: { key: value, ...},
            person: { name: Jack, ...},
            baz: { key: value, ...}
        },
        { 
            foo: { key: value, ...},
            bar: { key: value, ...},
            person: { name: Jill, ...},
            baz: { key: value, ...}
        },
        {
            ... #many more records
        }
    ]
}

......但是这些字符:

    ]
}
{
    people: [

...(加上第一个响应中最后一条记录末尾缺少逗号)使其无效JSON。

如何正确连接这两个JSON对象 - 即,将它们作为一个格式正确且有效的JSON对象写入文件?

最佳方式是什么?我认为最好从API响应之前中删除不需要的字段,以连接这两个对象并将它们写入文件。但是 - 如果我只是想在 写入文件后删除不需要的字符......我怎么能这样做呢?

我尝试过.replace(),。strip(),考虑使用正则表达式,尝试将数据粘贴到列表中并使用列表理解,尝试字典理解和一些生成器。不完全确定最佳和最惯用的行为是什么......

1 个答案:

答案 0 :(得分:1)

您的格式化代码不是有效的Python dict,也不是有效的JSON。

但是,如果您的数据类似于此格式(请参阅上文),则可以使用literal_eval模块中的ast并将数据转换为有效的python dict,然后您可以将其转储为提交或在你的程序中使用它。

见这个例子:

from ast import literal_eval as le

a = '''{
    'people': [
        { 
            'foo': { 'key': 'value'},
            'bar': { 'key': 'value'},
            'person': { 'name': 'Harry'},
            'baz': { 'key': 'value'}
        },
        { 
            'foo': { 'key': 'value'},
            'bar': { 'key': 'value'},
            'person': { 'name': 'Sally'},
            'baz': { 'key': 'value'}
        }]}'''

b = '''{
    'people': [
        { 
            'foo': { 'key': 'value'},
            'bar': { 'key': 'value'},
            'person': { 'name': 'Harry'},
            'baz': { 'key': 'value'}
        },
        { 
            'foo': { 'key': 'value'},
            'bar': { 'key': 'value'},
            'person': { 'name': 'Sally'},
            'baz': { 'key': 'value'}
        }]}'''



final = [le(a), le(b)]
print(final)

输出:

[{'people': [{'person': {'name': 'Harry'}, 'baz': {'key': 'value'}, 'bar': {'key': 'value'}, 'foo': {'key': 'value'}}, {'person': {'name': 'Sally'}, 'baz': {'key': 'value'}, 'bar': {'key': 'value'}, 'foo': {'key': 'value'}}]}, {'people': [{'person': {'name': 'Harry'}, 'baz': {'key': 'value'}, 'bar': {'key': 'value'}, 'foo': {'key': 'value'}}, {'person': {'name': 'Sally'}, 'baz': {'key': 'value'}, 'bar': {'key': 'value'}, 'foo': {'key': 'value'}}]}]