2017-02-21 6 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 '} {' ** is ** это выражение. –

 Смежные вопросы

  • Нет связанных вопросов^_^