Разбор невалидного JSON в Python, экранирование или удаление лишних двойных кавычек в ключе
В процессе парсинга получаю невалидный код JSON который необходимо распарсить функцией json.loads
import json
parsed_string = '{"name":"Иван","age":"25","bad":"Строка c лишн"им символом"}'
json.loads(parsed_string)
Очевидно получаю следующую ошибку :
File "/usr/lib/python3.8/json/decoder.py", line 353, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting ',' delimiter: line 1 column 61 (char 60)
подскажите как убрать лишнюю двойную кавычку у значения с ключом "bad"
к сожалению ресурс который пытаюсь спарсить иногла отдает JSON именно в таком виде, без экранирования лишних кавычек и повлиять я на это не могу
массив данных очень большой и где именно встретится лишняя кавычка и встретится ли вообще не предугадать
Ответы (1 шт):
import simplejson as json
import re
parsed_string = '{"name":"Иван", "age":"25","bad": "Строка c л,ишн"им символом"}'
def convert(elem: str):
return re.sub(r'(?<!^)"(?!$)', r'', elem)
items = ''.join(
map(
convert,
filter(
bool,
re.split(
r'(\{\s*?"|\s*?"\s*?:\s*?"|"\s*?,\s*?"|\s*?"\s*})',
parsed_string,
flags=re.S
)
)
)
)
print(json.loads(items))
# {'name': 'Иван', 'age': '25', 'bad': 'Строка c л,ишним символом'}
Или вот так:
import simplejson as json
import re
parsed_string = '{"name":"Иван", "age":"25","bad": ""Строка c л,ишн"им символом"}'
elements = [
*filter(
bool,
re.split(
r'(\{\s*?"|\s*?"\s*?:\s*?"|"\s*?,\s*?"|\s*?"\s*})',
parsed_string,
flags=re.S
)
)
]
for idx in range(1, len(elements), 2):
if isinstance(item := elements[idx], str):
elements[idx] = item.replace('"', '')
print(json.loads(''.join(elements)))
# {'name': 'Иван', 'age': '25', 'bad': 'Строка c л,ишним символом'}
В первом случае если двойная кавычка будет первым символом значения то будет ошибка
Справедливости ради нужно сказать, что данный метод будет работать только в том случае, если мы уверены, что все значения в json строковые и не пустые
'{"name":null, "age":"25","bad": ""Строка c л,ишн"им символом"}'
# На выходе даст
{'name:null, age': '25', 'bad': 'Строка c л,ишним символом'}
# ^^^^^^^^^^^^^^
'{"name":"", "age":"25","bad": ""Строка c л,ишн"им символом"}'
# Бросит исключение