2017-05-27 77 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'}}]}]