Страница 1 из 1

Экранирование текста в JSON

Добавлено: 27 Октябрь 2022, 16:43
Игорь Столяров
Привет всем !

Нужно экранировать строки при передаче запроса в JSON по паттерну: ^.*$ (т.е. все символы ?)
Например нужно трансформировать строку "Операция выполнена успешно" в
"\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e"
Не подскажите - есть ли уже такая готовая функция ? Или в WinAPI ? Как-то не хочется изобретать велосипед ... :(
Заранее спасибо !

Экранирование текста в JSON

Добавлено: 27 Октябрь 2022, 17:25
Дед Пахом
В cjson есть функция json::StringToULiterals:
- NEW: static function to convert string value to a sequence of unicode literals (i.e. \uXXXX\uYYYY):

json::StringToULiterals PROCEDURE(STRING pInput, UNSIGNED pInputCodepage = CP_ACP), STRING

Экранирование текста в JSON

Добавлено: 27 Октябрь 2022, 18:23
Игорь Столяров
Вау ! Спасибо, пошёл смотреть ... :ty:

Экранирование текста в JSON

Добавлено: 27 Октябрь 2022, 21:40
Игорь Столяров
Функция json::StringToULiterals() - работает, но есть беда ...

Код: Выделить всё

   ocd.description = 'Операция'
   ocd.description = json::StringToULiterals(ocd.description)  ! OK. Получили: '\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f'
      
   details &= json::CreateArray(ocd)  ! Теперь ведь нужно получить из группы JSON блок
   ! И получаем: "\\u041e\\u043f\\u0435\\u0440\\u0430\\u0446\\u0438\\u044f" 

Т.е. экранирующие символы - повторно экранируются и это не понимает ни REST сервер, ни просмотрщик JSON. :(
Может быть я что-то не понимаю ? Как избежать повторного экранирования экранирующих кодов ?

Спасибо, у меня вообще нет идей.

Экранирование текста в JSON

Добавлено: 27 Октябрь 2022, 22:19
Дед Пахом
У меня тоже нет идей, какой REST сервер, зачем вообще всё это?

Экранирование текста в JSON

Добавлено: 27 Октябрь 2022, 22:48
Игорь Столяров
Насколько я понимаю, комбинация "\u + followed by four-hex-digits" не должна экранироваться.
см. https://stackoverflow.com/questions/191 ... son-string
Дед Пахом писал(а): 27 Октябрь 2022, 22:19 зачем вообще всё это?
В запросе JSON нужно передавать строку с экранированными символами.
А иначе зачем метод json::StringToULiterals() ? Экранировать строку для передачи в JSON пакете.

Экранирование текста в JSON

Добавлено: 27 Октябрь 2022, 23:09
Дед Пахом
Игорь Столяров писал(а): 27 Октябрь 2022, 22:48 В запросе JSON нужно передавать строку с экранированными символами.
Мне кажется, что Вы усложняете. Вместо передачи серверу данных в Utf16 (\uXXXX) можно передать те же данные в Utf8 (details.ToUtf8()).

Экранирование текста в JSON

Добавлено: 27 Октябрь 2022, 23:24
Игорь Столяров
Спасибо, буду пробовать. В описании сказано передавать строку экранированной.
В примерах JSON (UTF8) все символы в передаваемых строках экранированны. Зачем ? Не знаю.
Сделаю свой тест и посмотрю как он пройдёт обработку на сервисе.

Экранирование текста в JSON

Добавлено: 28 Октябрь 2022, 0:14
Дед Пахом
Игорь Столяров писал(а): 27 Октябрь 2022, 22:48 Насколько я понимаю, комбинация "\u + followed by four-hex-digits" не должна экранироваться.
Это не так работает. json::StringToULiterals (это не метод, а процедура, кстати) просто перегоняет каждый символ в его шестисимвольное utf-16 представление. Не знаю, нахер это нужно, кто-то просил, я добавил.
Вот у Вас есть строка в формате json uStr = '"\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f"' (обратите внимание на обрамляющие кавычки: без них это не строка json, а просто набор символов). Тогда эту строку можно распарсить, получив json объект:

Код: Выделить всё

jItem &= jParser.Parse(uStr)
MESSAGE(jItem.ToString())  !- Выводит 'Операция'

Экранирование текста в JSON

Добавлено: 28 Октябрь 2022, 11:45
finsoftrz
Мне кажется, надо уточнить, что данный сервис понимает под экранированием. Обычно это замена спецсимволов на шестнадцатиричное представление, чтобы можно было корректно передать строку получателю. Соответственно, для json может заменять я один набор символов, для чего-то другого другой. Я, например, при передачи строки в get запросе просто перевожу все символы строки в шестнадцатиричное представление (несложно делается функция string to hex на базе стандартной bytetohex). Конкретно для json гугл выдает различные примеры на других языках, которые не должно быть сложно перенести на кларион.