Отключить экранирование json в потоке HTTP

1. VladimirUlanov 137 02.02.24 00:12 Сейчас в теме
Коллеги, добрый день.
Много вариантов перепробовал, но зашел в тупик.
Есть строка пример (маркировка): "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"); 

Прикрепленные файлы:
Вознаграждение за ответ
Показать полностью
Найденные решения
8. laperuz 47 02.02.24 09:28 Сейчас в теме +1 $m
(7)Base64 это не про ваш случай, т.к. сторона приемник - не ваш сервис.
Если это делает преобразование в JSON - самый простой способ не ломать голову - сделать так:

СериализованнаяСтрока = СтрЗаменить(СериализованнаяСтрока, "\\u001d", "\u001d")


Костыль, конечно, но зато будет работать)
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user856012 14 02.02.24 01:20 Сейчас в теме
(1)
В параметрах записи принудительно уже указываю что не нужно ничего использовать, всё равно происходит экранирование.
А вы правильно указываете параметры? На ИТС все по-другому: экранирование по умолчанию отключено, а включается не четвертым параметром ПараметрыЗаписиJSON, а девятым.
6. VladimirUlanov 137 02.02.24 09:18 Сейчас в теме
(2) Тут увы от безысходности уже начал принудительно переводить все в ложь. Изначально да только 9 параметр в ложь переводил, потом уже все перевел...
3. laperuz 47 02.02.24 06:42 Сейчас в теме
Так у вас в какой момент 2 слэша?

Попробуйте не через поток, а через
HTTPRequest.УстановитьТелоИзСтроки();
, JSON соответственно писать в строку. Можно будет хотя бы понять это слэш добавляется в момент преобразования в JSON или это делает HTTPСоединение
7. VladimirUlanov 137 02.02.24 09:24 Сейчас в теме
(3) Спасибо, да слеш добавляется в момент преобразования в json... Но это не решает проблему...
Получается куда дальше можно копнуть, чтобы не преобразовывал? На счет base64 о чем писали ниже не совсем ясно.
Прикрепленные файлы:
8. laperuz 47 02.02.24 09:28 Сейчас в теме +1 $m
(7)Base64 это не про ваш случай, т.к. сторона приемник - не ваш сервис.
Если это делает преобразование в JSON - самый простой способ не ломать голову - сделать так:

СериализованнаяСтрока = СтрЗаменить(СериализованнаяСтрока, "\\u001d", "\u001d")


Костыль, конечно, но зато будет работать)
10. VladimirUlanov 137 02.02.24 09:29 Сейчас в теме
(8) Я прям в этот же момент это же и ответил) Так и сделаем) Спасибо!
9. VladimirUlanov 137 02.02.24 09:28 Сейчас в теме
(7) Сделал костыль после преобразования в json и проблема решилась, спасибо!
Конечно бы узнать решение без костыля такого, но думаю позже кто то напишет. Не хочет добавлять как код, добавлю как текст:
ЗаписьJSON = новый ЗаписьJSON();
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтрукОтправYM);
сериализованнаяСтрока = ЗаписьJSON.Закрыть();
сериализованнаяСтрока = СтрЗаменить(сериализованнаяСтрока,"\\","\"); //КОСТЫЛЬ
HTTPRequest.УстановитьТелоИзСтроки(сериализованнаяСтрока);
11. laperuz 47 02.02.24 09:31 Сейчас в теме
(9)Оффтоп: если платформа 23 и выше, то там будет работать упрощенный вариант записи JSON:

СериализованнаяСтрока = ЗаписатьЗначениеJSON(СтрукОтправYM);
VladimirUlanov; +1 Ответить
4. Dnki 4 02.02.24 08:27 Сейчас в теме
Мне видится, что само направление усилий неверное. Механизм просто ОБЯЗАН что-то делать с символами, не похожими на буквы. Иначе чтение станет невозможным. Представьте семя на месте чтеца такого файла. Встретился в тексте один из символов { [ ] } кавычки, а еще есть "Перевод строки" и "Возврат каретки" (по памяти юности, 0x0D и 0x0A). Тогда стой и ломай голову, это кусок данных или управляющий символ, вроде завершить конструкцию, перевести строку и т.п.
Вывод: нельзя вставлять в строковые данные любые символы (их называют "непечатными") в оригинальном виде, как Вы хотите. А чтобы механизм их не преобразовывал, самому преобразовать в Base64. При приеме сделать обратное.
5. laperuz 47 02.02.24 08:29 Сейчас в теме
(4)Ну тут у ТСа выбора нет, в описании API Яндекса черным по персиковому написано не экранировать, т.е. приемник готов в таком виде обрабатывать.

https://yandex.ru/dev/market/partner-api/doc/ru/reference/orders/setOrderBoxLayout#brieforderiteminstancedto

P.S. вообще по поводу перевода в Base64 полностью поддерживаю, так можно передавать, например, кириллицу в заголовках HTTP например, так:
Base64Строка(ПолучитьДвоичныеДанныеИзСтроки("АБВ"))
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот