Перейти к содержимому

Как экранировать кавычки в json

  • автор:

Как экранировать кавычки в 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? Вот похожий вопрос, но на него никто не ответил(

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *