Задать вопрос
pavel0staratel
@pavel0staratel

Как распарсить строку с не совсем корректным json'ом?

Есть строка, похожая на невалидный JSON, в которой данные в основном представлены как ключ: значение, но иногда есть только ключ, или 2 ключа и одно значение.
input_str="""name1: value1; name2: value2; name3; prefix: name4: value4;"""

Хочу получить такой словарь:
output_dict={'name1': 'value1', 'name2': 'value2', 'name3':True, 'prefix name4': 'value4'}

Пытался распарсить её с помощью json.loads(предварительно расставив кавычки и т.п.), но не знаю как обрабатывать ситуации с name3 и name4.

UPDATE:
Сделал так:
import json

input_str="""name1: value1; name2: value2; name3; prefix: name4: value4;"""
if input_str[-1]==';':
    input_str=input_str[:-1]

god_str='","'.join([{0: item+': True', 1: item}.get(item.count(':'),item.replace(":", " ", 1)) for item in json.dumps(input_str).split('; ')])
json_str='{%s}'%god_str.replace(': ','":"')

output_dict=json.loads(json_str)
print(output_dict)

Результат:
{'prefix  name4': 'value4', 'name1': 'value1', 'name2': 'value2', 'name3': 'True'}

Всё хорошо, вот только True в кавычках.
  • Вопрос задан
  • 527 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 1
adugin
@adugin Куратор тега Python
def tokenize(data):
    cleanup = lambda entry: entry.replace(':', '').strip()
    for entry in data.strip(';').split(';'):
        entry = map(cleanup, entry.rsplit(':',1))
        if len(entry) == 1:
            entry.append(True)
        yield entry

input = 'name1: value1; name2: value2; name3; prefix: name4: value4;'
print dict(tokenize(input))

Результат:
{'prefix name4': 'value4', 'name2': 'value2', 'name3': True, 'name1': 'value1'}

Ещё можно вот в таком направлении поиграться:
>>> dict(re.findall('\s*([\w\s:]+?)\s*(?::\s*([\w\s]*)\s*)?(?=[;$])', input))
{'prefix: name4': 'value4', 'name2': 'value2', 'name3': '', 'name1': 'value1'}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
IonDen
@IonDen
JavaScript developer. IonDen.com
Можно сделать так:
jsfiddle.net/IonDen/gm5yvmrj
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы