Разбор невалидного 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 шт):

Автор решения: Namerek
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 л,ишн"им символом"}'
# Бросит исключение
→ Ссылка