Форматирование JSON для Python — нужно удалить \"

У меня есть 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_string вам нужно избегать обратной косой черты. Если вы print(json_string), вы увидите, что желаемая обратная косая черта отсутствует. Возможно, это просто ошибка в примере, но он не репрезентативен, как написано.

Woodford 25.06.2024 00:52

Что такое сообщение об ошибке? Это недопустимый JSON (он должен находиться в пределах {}, даже если escape-коды работают). В этом примере вы имеете дело с правилами escape строкового литерала Python. print(json_string) и вы увидите, что обратной косой черты нет. Откуда взялась эта строка JSON? Можете ли вы проверить точную строку, а не какое-то экранированное отображение строки? Может, записать в файл и просмотреть текстовым редактором?

tdelaney 25.06.2024 01:14

Например, если я напишу в файл ровно {"description":"I'm just \"A BOY\" okay?"} и прочитаю его с помощью print(json.load(open("test.json"))["description"]), я получу строку: I'm just "A BOY" okay?. Я мог бы использовать регулярное выражение, чтобы удалить литерал \" перед json.load или удалить " из значений после загрузки.

tdelaney 25.06.2024 01:22

В ваших данных нет обратной косой черты. Есть только обратная косая черта с кавычкой, обозначающая экранированную кавычку. Кавычки экранируются, поскольку в этом месте они не разрешены синтаксисом.

Klaus D. 25.06.2024 04:47

Нет необходимости использовать регулярное выражение, достаточно простого json_string.replace(r'\"', '').

Mark Ransom 25.06.2024 17:38

Я только что отредактировал, но это не позволило мне оставить сводку редактирования, поэтому я пока помещаю ее в комментарий: Полностью интегрировать редактирование. Удалить решение: решения содержатся в ответах, а не в вопросе. Удалите избыточные, искаженные данные.

wjandrea 25.06.2024 19:24

Забыл сказать, добро пожаловать в Stack Overflow! Ознакомьтесь с туром и Как задавать , чтобы получить советы по будущим вопросам, например, создать минимальный воспроизводимый пример перед публикацией.

wjandrea 25.06.2024 19:25
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
7
91
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ваш 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 \" представляет собой ", который является необработанными данными.

Другие вопросы по теме