2017-02-21 57 views
0

有包含兩個或更多的JSON字符串像這樣的文件:提取JSON其中包含兩個或兩個以上的JSON對象

{ 
"a":"1", 
"b":"2" 
} 
{ 
"c":"3", 
"d":"4" 
} 

如何使用Python這些JSON字符串從該文件轉換成JSON對象?

+1

我會修復如何創建該文件以生成有效的JSON –

+0

這些不是有效的JSON對象,因爲這些值之間沒有逗號。 – niemmi

+0

@ cricket_007對不起,我忘記了!我現在修復它 – Guo

回答

2

您可以使用re.split同時保留括號分裂的}\W*{每次出現,然後每個項目轉換的結果與json.loads

import json 
import re 

s = '''{ 
"a":"1", 
"b":"2" 
} 
{ 
"c":"3", 
"d":"4" 
}''' 

res = [json.loads(g) for g in re.split(r'(?<=})\W*(?={)', s)] 
print(res) 

輸出:

[{'b': '2', 'a': '1'}, {'c': '3', 'd': '4'}] 

在上述正則表達式(?<=})是正向lookbehind斷言,導致\W*只有在緊接着}之前匹配。類似地,(?={)是肯定前瞻斷言,其要求{遵循\W*

更新或者,您可以使用re.finditer來查找匹配而不是拆分字符串。它還將在的情況下工作,那裏的對象之間沒有空格:

import json 
import re 

s = '''{ 
"a":"1", 
"b":"2" 
}{ 
"c":"3", 
"d":"4" 
} 
{ 
"foo":"bar" 
}''' 

res = [json.loads(m.group(0)) for m in re.finditer(r'({.*?}\W*(?=({|$)))', s, re.DOTALL)] 
print(res) 

輸出:

[{'a': '1', 'b': '2'}, {'d': '4', 'c': '3'}, {'foo': 'bar'}] 

注意,這兩種方法,如果你的JSON有} {與任何字符串上面將打破兩者之間的空白量。

+0

謝謝!我知道了! – Guo

+0

如何匹配'} {'使用正則表達式?我使用're.split(r'(?<=})(?= {)',s)',但總是失敗。 – Guo

+0

@Guo'} {'**是**的表達。 –