Отключить экранирование json в потоке HTTP
Коллеги, добрый день.
Много вариантов перепробовал, но зашел в тупик.
Есть строка пример (маркировка): "0104660250738335215.WxjhAJaFr,g\u001d9100C0\u001d92v9yeAe3q5Z"
Нужно чтобы строка не меняла вид когда мы её записываем в json, из кода убрал лишние параметры из структуры, так как они для примера не нужны ну и строку поменьше:
По итогу получаем ответ и видим, что отправили мы не нашу строку, которую написал вышел, а где слеш, он их сделал 2 слешами.
"0104660250738335215.WxjhAJaFr,g\\u001d9100C0\\u001d92v9yeAe3q5Z"
В параметрах записи принудительно уже указываю что не нужно ничего использовать, всё равно происходит экранирование. Что стандарты json экранируют 1 слеш в 2 слеша. А мне это не надо. Как изменить чтобы отправлялся 1 слеш?
Через постман всё ок, отправляется, там вопросов нет.
Немного предистории, в самой строке сначала подменяю, где символы 91 и 92, ставлю туда спец символы:
Много вариантов перепробовал, но зашел в тупик.
Есть строка пример (маркировка): "0104660250738335215.WxjhAJaFr,g\u001d9100C0\u001d92v9yeAe3q5Z"
Нужно чтобы строка не меняла вид когда мы её записываем в json, из кода убрал лишние параметры из структуры, так как они для примера не нужны ну и строку поменьше:
СтрукОтправки = Новый Структура;
СтрукОтправки.Вставить("cis","0104660250738335215.WxjhAJaFr,g\u001d9100C0\u001d92v9yeAe3q5Z");
ПараметрыJSO = Новый ПараметрыЗаписиJSON(,,,ЭкранированиеСимволовJSON.Нет,ЛОЖЬ,ЛОЖЬ,ЛОЖЬ,ЛОЖЬ,ЛОЖЬ);
JSONData = Новый ЗаписьJSON;
JSONData.ОткрытьПоток(HTTPRequest.ПолучитьТелоКакПоток(),,,ПараметрыJSO);
ЗаписатьJSON(JSONData,СтрукОтправки,,"СериализацияСсылок");
СтрокаJS = JSONData.Закрыть();
Результат = HTTPСоединение.ВызватьHTTPМетод("PUT",HTTPRequest);
ПоказатьПо итогу получаем ответ и видим, что отправили мы не нашу строку, которую написал вышел, а где слеш, он их сделал 2 слешами.
"0104660250738335215.WxjhAJaFr,g\\u001d9100C0\\u001d92v9yeAe3q5Z"
В параметрах записи принудительно уже указываю что не нужно ничего использовать, всё равно происходит экранирование. Что стандарты json экранируют 1 слеш в 2 слеша. А мне это не надо. Как изменить чтобы отправлялся 1 слеш?
Через постман всё ок, отправляется, там вопросов нет.
Немного предистории, в самой строке сначала подменяю, где символы 91 и 92, ставлю туда спец символы:
Марк = Выборка.Маркировка;
Марк = СтрЗаменить(Марк,"91","\u001d91");
Марк = СтрЗаменить(Марк,"92","\u001d92");
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
(7)Base64 это не про ваш случай, т.к. сторона приемник - не ваш сервис.
Если это делает преобразование в JSON - самый простой способ не ломать голову - сделать так:
Костыль, конечно, но зато будет работать)
Если это делает преобразование в JSON - самый простой способ не ломать голову - сделать так:
СериализованнаяСтрока = СтрЗаменить(СериализованнаяСтрока, "\\u001d", "\u001d")Костыль, конечно, но зато будет работать)
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
В параметрах записи принудительно уже указываю что не нужно ничего использовать, всё равно происходит экранирование.
А вы правильно указываете параметры? : экранирование по умолчанию отключено, а включается не четвертым параметром ПараметрыЗаписиJSON, а девятым.
Так у вас в какой момент 2 слэша?
Попробуйте не через поток, а через , JSON соответственно писать в строку. Можно будет хотя бы понять это слэш добавляется в момент преобразования в JSON или это делает HTTPСоединение
Попробуйте не через поток, а через
HTTPRequest.УстановитьТелоИзСтроки();
(3) Спасибо, да слеш добавляется в момент преобразования в json... Но это не решает проблему...
Получается куда дальше можно копнуть, чтобы не преобразовывал? На счет base64 о чем писали ниже не совсем ясно.
Получается куда дальше можно копнуть, чтобы не преобразовывал? На счет base64 о чем писали ниже не совсем ясно.
Прикрепленные файлы:
(7)Base64 это не про ваш случай, т.к. сторона приемник - не ваш сервис.
Если это делает преобразование в JSON - самый простой способ не ломать голову - сделать так:
Костыль, конечно, но зато будет работать)
Если это делает преобразование в JSON - самый простой способ не ломать голову - сделать так:
СериализованнаяСтрока = СтрЗаменить(СериализованнаяСтрока, "\\u001d", "\u001d")Костыль, конечно, но зато будет работать)
(7) Сделал костыль после преобразования в json и проблема решилась, спасибо!
Конечно бы узнать решение без костыля такого, но думаю позже кто то напишет. Не хочет добавлять как код, добавлю как текст:
ЗаписьJSON = новый ЗаписьJSON();
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтрукОтправYM);
сериализованнаяСтрока = ЗаписьJSON.Закрыть();
сериализованнаяСтрока = СтрЗаменить(сериализованнаяСтрока,"\\","\"); //КОСТЫЛЬ
HTTPRequest.УстановитьТелоИзСтроки(сериализованнаяСтрока);
Конечно бы узнать решение без костыля такого, но думаю позже кто то напишет. Не хочет добавлять как код, добавлю как текст:
ЗаписьJSON = новый ЗаписьJSON();
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтрукОтправYM);
сериализованнаяСтрока = ЗаписьJSON.Закрыть();
сериализованнаяСтрока = СтрЗаменить(сериализованнаяСтрока,"\\","\"); //КОСТЫЛЬ
HTTPRequest.УстановитьТелоИзСтроки(сериализованнаяСтрока);
Мне видится, что само направление усилий неверное. Механизм просто ОБЯЗАН что-то делать с символами, не похожими на буквы. Иначе чтение станет невозможным. Представьте семя на месте чтеца такого файла. Встретился в тексте один из символов { [ ] } кавычки, а еще есть "Перевод строки" и "Возврат каретки" (по памяти юности, 0x0D и 0x0A). Тогда стой и ломай голову, это кусок данных или управляющий символ, вроде завершить конструкцию, перевести строку и т.п.
Вывод: нельзя вставлять в строковые данные любые символы (их называют "непечатными") в оригинальном виде, как Вы хотите. А чтобы механизм их не преобразовывал, самому преобразовать в Base64. При приеме сделать обратное.
Вывод: нельзя вставлять в строковые данные любые символы (их называют "непечатными") в оригинальном виде, как Вы хотите. А чтобы механизм их не преобразовывал, самому преобразовать в Base64. При приеме сделать обратное.
(4)Ну тут у ТСа выбора нет, в описании API Яндекса черным по персиковому написано не экранировать, т.е. приемник готов в таком виде обрабатывать.
P.S. вообще по поводу перевода в Base64 полностью поддерживаю, так можно передавать, например, кириллицу в заголовках HTTP например, так:
P.S. вообще по поводу перевода в Base64 полностью поддерживаю, так можно передавать, например, кириллицу в заголовках HTTP например, так:
Base64Строка(ПолучитьДвоичныеДанныеИзСтроки("АБВ"))
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот
