Объект JSON в одинарных кавычках без escape-символов

#python #json #string

#python #json #строка

Вопрос:

Я пытаюсь создать объект son из необработанной строки, которую я получаю в потоке реального времени для обработки. Строка, которую я обрабатываю, является:

 {‘check_1’:{‘key_1’:15017.118,‘key_2’:’HTTPConnectionPool(host=‘host_1’, port=80): Read timed out. (read timeout=15)’,’key_3’:’Some reason here’}}
  

Я пытаюсь заменить одинарную кавычку двойными кавычками чем-то вроде

 str = str.replace(",'", ',"').replace("',", '",')
str = str.replace(":'", ':"').replace("':", '":')
str = str.replace("{'", '{"').replace("'}", '"}')
  

но значение для key_2 вызывает проблему, когда я это делаю, json.loads(str) потому что значение key_2 имеет несколько одинарных кавычек.

Один из способов, о котором я думаю, — это использование регулярных выражений с обратным распространением. Есть ли какой-либо другой способ преобразовать строки этого типа в объект son.

Комментарии:

1. Есть ли у вас контроль над исходным кодом? Похоже, что он отправляет недопустимый JSON.

2. Ни один из ваших элементов и ключей не заключен в кавычки обратите внимание: ' вы используете ключ-апостроф, я думаю, он вызывается. Тот, что рядом с вашим 1

3. для key2 у вас есть пробел между завершающим key1 и начальным key2. Итак, вам не хватает одной замены: .replace(«, ‘», ‘, «‘)

4. Помимо определенных символов кавычек (если они действительно не являются парами кавычек слева и справа), у вас есть вложенные кавычки, которые будет сложно обработать должным образом. Это ошибка в производителе, и ее следует исправить.

5. Смотрите кавычки ASCII и Unicode для получения дополнительной информации о том, что я сказал ранее относительно используемых кавычек. FWIW Я также согласен с @chepner в том, что лучшим решением было бы исправить источник этих строк, а не фиктивный вывод, который он выдает.

Ответ №1:

Этот быстрый взлом с библиотекой re, похоже, работает

 import re
thestring = re.sub(r'[‘’]', '"', thestring) # don't call your variable str
thestring = re.sub(r'="(S )"', r"='1'", thestring)
print( json.loads(thestring))
  

Комментарии:

1. Моя ошибка, сначала замена в двойные кавычки, затем в одинарные кавычки, когда встречается символ «=». Исправлено

2. это недопустимый json, и даже вы преобразуете все отдельные ‘ в » как это было бы object, поскольку внутри было бы несколько »