Как экранировать кавычки в json
При записи строки с кавычкой в JSON получаю лишний символ (обратный слеш).
ЗаписьJSON = Новый ЗаписьJSON();
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, «__»»__»);
СтрокаJSON = ЗаписьJSON.Закрыть();
возвращает «__\»__»
При обратном преобразовании символ сохраняется.
Что-то лыжи не едут. Гугл молчит. Баг?
ПараметрыЗаписиJSON (JSONWriterSettings)
ЭкранированиеСимволов (EscapeCharacters)
Использование:
Только чтение.
Описание:
Тип: ЭкранированиеСимволовJSON.
Определяет способ экранирования символов при записи документа JSON.
После создания объекта данное свойство имеет значение Нет.
Доступность:
Тонкий клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Использование в версии:
Доступен, начиная с версии 8.3.6.
Методическая информация
ЭкранированиеСимволов тут каким боком?
доступные значения: Нет, СимволыВнеASCII, СимволыВнеBMP. По умолчанию: Нет.
Перебрал все возможные значения — результат тот же.
Конструктор по умолчанию устанавливает:
ЗаписьJSON.Параметры.ИспользоватьДвойныеКавычки — истина
ЗаписьJSON.Параметры.ЭкранироватьОдинарныеКавычки — ложь
Как FOR JSON экранирует специальные и управляющие символы (SQL Server)
В этой статье описывается, как FOR JSON предложение инструкции SQL Server SELECT экранирует специальные символы и представляет символы управления в выходных данных JSON.
В этой статье описывается встроенная поддержка JSON в Microsoft SQL Server. Общие сведения о экранировании и кодировке в ФОРМАТЕ JSON см. в разделе 2.5 RFC JSON.
Экранирование специальных символов
Если исходные данные содержат специальные символы, FOR JSON предложение экранирует их в выходных данных JSON, \ как показано в следующей таблице. Такое экранирование происходит как в именах свойств, так и в их значениях.
| Специальный знак | Экранированные выходные данные |
|---|---|
| Кавычка ( » ) | \» |
| Обратная косая черта ( \ ) | \\ |
| Косая черта ( / ) | \/ |
| Backspace | \b |
| Подача страницы | \f |
| Новая строка | \n |
| Возврат каретки | \r |
| Горизонтальная табуляция | \t |
Управляющие символы
Если исходные данные содержат символы элемента управления, FOR JSON предложение кодирует их в выходных данных JSON в \u формате, как показано в следующей таблице.
| Управляющий символ | Закодированные выходные данные |
|---|---|
| CHAR(0) | \u0000 |
| CHAR(1) | \u0001 |
| . | . |
| CHAR(31) | \u001f |
Пример
Ниже приведен пример FOR JSON выходных данных для исходных данных, включающих как специальные символы, так и управляющие символы.
SELECT 'VALUE\ / "' AS [KEY\/"], CHAR(0) AS '0', CHAR(1) AS '1', CHAR(31) AS '31' FOR JSON PATH;
Следующие шаги
- Преобразование результатов запроса в формат JSON с помощью предложения FOR JSON (SQL Server)
- SELECT — предложение FOR (Transact-SQL)
- JSON as a bridge between NoSQL and relational worlds (JSON как мост между NoSQL и реляционными решениями)
JSON формат, экранирование символов
О чем здесь будет речь. О том как использовать Json формат данных в GUI приложении Windows с использованием удаленной базы MySql на сервере в интернете.
Приложениие на Qt обменивается информацией с сервером по HTTP json протоколу.
Например серверу посылается в теле байты:
Тут видно , что символ двойные кавычки экранируется, иначе нельзя никак , так как структуру json на сервере не удастся декодировать через jsob_decode (php).
Обратно сервер отвечает таким же способом, кодируя свои Json данные через json_encode.
Это все понятно с небольшими нюансами.
Но далее данные из полученного json пакета сервер хочет сохранить в базе MySql.
И тут надо еще раз экранировать экранированные символы, чтобы избежать умышленного вредительства (sql инъекции и т.д.).
То есть переменную aaa надо сохранять в виде:
bbb\\\"bb\\\'b
Впоследствии, когда мы будем (допустим к примеру) считывать переменную aaa из базы и передавать нашему приложению в http запросе, то данные уже экранировать возможно не надо.
В приложение мы обратно должны в http ответе также получить экранированные символы как и при передаче серверу:
Далее в приложении (на Qt) мы сохраняем переменную aaa допустим в виджет QLineEdit и там видим ее уже так (без экранирования):
bbb"bb'b
И это тоже правильно.
Далее редактируем ее в в QLineEdit как нам вздумается добавляя все возможные символы и спец.символы.
Потом опять сохраняем эти данные на сервере, но предварительно экранируем двойные кавычки и обратный слэш.
Точнее сначала экранируем обратный слэш, а потом двойную кавычку.
И в результате мы теперь гоняем данные туда сюда корректно.
Парсинг JSON в котором встречаются «кавычки в кавычках»
Есть вот такие json данные, полученные в результате сохранения словаря:
Проблема №1: такой json является не стандартным и его Десериализация(json.loads) вызывает ошибку так как кавычки одинарные. Проблема №2 внутри элемента ‘name’ содержатся «кавычки в кавычках», т.е. банальная замена одинарных кавычек на двойные проблему не решает. Пробовал использовать функцию json.dumps, и потом передавать объект в json.loads, но почему то возвращается не словарь, а строка.
import json str_json = "" dmp = json.dumps( str_json ) jstr = json.loads(dmp) print(jstr['id'])
TypeError: string indices must be integers
Подскажите пожалуйста как быстро и без «костелей» разобрать «такой» json? Вот похожий вопрос, но на него никто не ответил(