以python方式连接两个相似但高度嵌套的JSON对象



我有一个巨大的"人"记录的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(),考虑使用正则表达式,尝试将数据粘贴到列表中并使用列表理解,尝试字典理解和一些生成器。不完全确定最好和最惯用的行动方案是什么......

格式化的代码不是有效的 Python 字典,也不是有效的 JSON。

但是,如果你的数据是这样的格式(见上文),你可以使用ast模块中的literal_eval并将你的数据转换为有效的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'}}]}]

最新更新