2017-05-27 40 views
0

我有“人”记录了巨大的JSON对象......像这样 - 牵强通过API调用使用要求:Pythonically连接两个类似,但高度嵌套的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 
     } 
    ] 
} 

而且到第二呼叫同样的API产生的formmatted和标签完全一样的附加记录...

{ 
    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

但是你给格式化的代码是不是有效的JSON既不是有效的Python字典。 –

+0

你有没有试过[json.dump](https://docs.python.org/2/library/json.html#json.dump)? –

+0

你为什么不把'人员列表合并为一个? –

回答

1

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

但是,如果你的数据是这样的格式(见上文),您可以使用literal_evalast模块和数据转换成有效的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'}}]}]