У меня есть JSON, который выглядит так:
{"name": "John",
"description": "I'm just \"A BOY\" okay? He said \"Hello, World!\" to everyone.",
"remark": "\"This is a test\" he mentioned."}
И экземпляры \"
ломаются json.loads()
.
import json
json_string = '''{"name": "John",
"description": "I'm just \"A BOY\" okay? He said \"Hello, World!\" to everyone.",
"remark": "\"This is a test\" he mentioned."}'''
data = json.loads(json_string)
print(data)
повышает:
json.decoder.JSONDecodeError: Expecting ',' delimiter: line 2 column 27 (char 43)
У меня такое чувство, будто я испробовал каждое регулярное выражение под солнцем, чтобы нацелиться на эти экземпляры (но оставить все остальные двойные кавычки без обратной косой черты) и заменить их пустой строкой (функционально просто удалить их). Если у кого-нибудь есть советы, буду признателен.
Моя реализация сейчас выглядит примерно так:
import re
# Define a regular expression pattern to match \" within a string
pattern = r'\\"'
# Use re.sub to replace all occurrences of the pattern with an empty string
cleaned_string = re.sub(pattern, '', json_string)
print(cleaned_string)
Но когда я запускаю это в ответе, ничего не меняется.
Для справки, мне бы хотелось, чтобы результат был:
{"name": "John",
"description": "I'm just A BOY okay? He said Hello, World! to everyone.",
"remark": "This is a test he mentioned."}
Обновлено: для ясности это всего лишь пример характера входных данных, с которыми я работаю, они поступают из журналов AWS Cloudwatch, поэтому у меня нет простого способа манипулировать входными данными перед перетаскиванием их в Python. Например, часть полезной нагрузки выглядит примерно так:
"\"Girl Let's Talk\" Virtual 90s Kickback"
В контексте:
{"search_ads": [ {"event_id": "4838383", "ad_id": "1112", "budget_amount": 5.0, "currency": "USD", "marketplace": "Online_US", "score": 18.205433, "p_click": 0.0, "p_order": 0.0, "goal": 2, "category_id": 113, "subcategory_id": 13999, "format": null, "is_paid": false, "online_event": true, "event_start_date": "2024-06-28T00:00:00Z", "latitude": null, "longitude": null, "name": "\"Girl Let's Talk\" Virtual 90s Kickback", "vip_status": false, "is_participant": true}]}
так что символы \"
на самом деле являются единственной проблемой: если я скопирую все эти входные данные в VS Code и просто найду/удалю этот шаблон, json.loads()
отлично будет работать и так.
Как заметил один комментатор, я думаю, что я ищу регулярное выражение, которое будет соответствовать шаблону и удалять его \"
, но мне пока с этим не повезло! Мне удалось удалить только \s
, в результате чего у меня остаются двойные кавычки, которые нарушают json.loads()
(ожидая, что разделитель, то есть думает, что это еще одна пара ключ/значение JSON), или удалить все двойные кавычки, что, конечно, полностью нарушает то же самое.
Что такое сообщение об ошибке? Это недопустимый JSON (он должен находиться в пределах {}, даже если escape-коды работают). В этом примере вы имеете дело с правилами escape строкового литерала Python. print(json_string)
и вы увидите, что обратной косой черты нет. Откуда взялась эта строка JSON? Можете ли вы проверить точную строку, а не какое-то экранированное отображение строки? Может, записать в файл и просмотреть текстовым редактором?
Например, если я напишу в файл ровно {"description":"I'm just \"A BOY\" okay?"}
и прочитаю его с помощью print(json.load(open("test.json"))["description"])
, я получу строку: I'm just "A BOY" okay?
. Я мог бы использовать регулярное выражение, чтобы удалить литерал \"
перед json.load или удалить "
из значений после загрузки.
В ваших данных нет обратной косой черты. Есть только обратная косая черта с кавычкой, обозначающая экранированную кавычку. Кавычки экранируются, поскольку в этом месте они не разрешены синтаксисом.
Нет необходимости использовать регулярное выражение, достаточно простого json_string.replace(r'\"', '')
.
Я только что отредактировал, но это не позволило мне оставить сводку редактирования, поэтому я пока помещаю ее в комментарий: Полностью интегрировать редактирование. Удалить решение: решения содержатся в ответах, а не в вопросе. Удалите избыточные, искаженные данные.
Забыл сказать, добро пожаловать в Stack Overflow! Ознакомьтесь с туром и Как задавать , чтобы получить советы по будущим вопросам, например, создать минимальный воспроизводимый пример перед публикацией.
Ваш JSON-фрагмент кажется действительным, но вам нужно написать
json_string = '''
"name": "John",
"description": "I'm just \\"A BOY\\" okay? He said \\"Hello, World!\\" to everyone.",
"remark": "\\"This is a test\\" he mentioned."
'''
в вашем коде. Вероятно, это будет менее запутанно, если вы загружаете его из файла, избегая двойной обратной косой черты.
А еще pattern = r'\\"'
это слишком много. Напишите pattern = r'\"'
или pattern = '\\"'
.
\"
удалять не нужно. Это часть данных.*
У вас проблема с интерпретацией строковых литералов в Python. Последовательность \"
— это escape-последовательность, которая превращается просто в "
.
>>> '\"'
'"'
Эту проблему можно решить с помощью необработанной строки (префикс r
).
import json
json_string = r'''
{"name": "John",
"description": "I'm just \"A BOY\" okay? He said \"Hello, World!\" to everyone.",
"remark": "\"This is a test\" he mentioned."}
'''
data = json.loads(json_string)
print(data['description'])
Выход:
I'm just "A BOY" okay? He said "Hello, World!" to everyone.
Однако вы можете предпочесть поместить JSON в отдельный файл и использовать json.load()
, чтобы вообще не возиться со строковыми литералами.
* Точнее, это часть JSON. В строке JSON \"
представляет собой "
, который является необработанными данными.
При определении
json_string
вам нужно избегать обратной косой черты. Если выprint(json_string)
, вы увидите, что желаемая обратная косая черта отсутствует. Возможно, это просто ошибка в примере, но он не репрезентативен, как написано.