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

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

Сообщение Игорь Столяров »

Привет всем !

Нужно экранировать строки при передаче запроса в 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 ? Как-то не хочется изобретать велосипед ... :(
Заранее спасибо !
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

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

Сообщение Дед Пахом »

В 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
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

Сообщение Игорь Столяров »

Вау ! Спасибо, пошёл смотреть ... :ty:
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

Сообщение Игорь Столяров »

Функция 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. :(
Может быть я что-то не понимаю ? Как избежать повторного экранирования экранирующих кодов ?

Спасибо, у меня вообще нет идей.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

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

Сообщение Дед Пахом »

У меня тоже нет идей, какой REST сервер, зачем вообще всё это?
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

Сообщение Игорь Столяров »

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

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

Сообщение Дед Пахом »

Игорь Столяров писал(а): 27 Октябрь 2022, 22:48 В запросе JSON нужно передавать строку с экранированными символами.
Мне кажется, что Вы усложняете. Вместо передачи серверу данных в Utf16 (\uXXXX) можно передать те же данные в Utf8 (details.ToUtf8()).
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

Сообщение Игорь Столяров »

Спасибо, буду пробовать. В описании сказано передавать строку экранированной.
В примерах JSON (UTF8) все символы в передаваемых строках экранированны. Зачем ? Не знаю.
Сделаю свой тест и посмотрю как он пройдёт обработку на сервисе.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

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

Сообщение Дед Пахом »

Игорь Столяров писал(а): 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())  !- Выводит 'Операция'
С уважением, ДП
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4615
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 37 раз

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

Сообщение finsoftrz »

Мне кажется, надо уточнить, что данный сервис понимает под экранированием. Обычно это замена спецсимволов на шестнадцатиричное представление, чтобы можно было корректно передать строку получателю. Соответственно, для json может заменять я один набор символов, для чего-то другого другой. Я, например, при передачи строки в get запросе просто перевожу все символы строки в шестнадцатиричное представление (несложно делается функция string to hex на базе стандартной bytetohex). Конкретно для json гугл выдает различные примеры на других языках, которые не должно быть сложно перенести на кларион.
C6/C11, ШВС, tps/btrieve.
Ответить