|
1С:Предприятие
:: 1С:Предприятие 8 общая
|
|
| ||
dsdred 19.09.16 - 15:28 | Добрый день!
Кто нибудь делал массив массивов в JSON на основании данных 1с? Делаю http сервис и наткнулся на проблему собрать ответ в формате JSON. Собственно все примеры которые есть возвращают простейшую структуру JSON. Вот один из таких примеров: http://v8.1c.ru/o7/201410json/index.htm Мне нужно вернуть массив в котором структура, а в структуре еще массив структур. Никак не могу понять как вложенный массив нормально записать. Пока выходит как строка, которую нужно десерелизовать... Если кто нибудь делал вложенность поделитесь опытом. Делаю так: ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, " ", Истина); Запись = Новый ЗаписьJSON; Запись.УстановитьСтроку(ПараметрыJSON); Запись.ПроверятьСтруктуру = Истина; //Начало_Массив_1 Запись.ЗаписатьНачалоМассива(); Для Каждого СтрокаТЗ из ТЗ Цикл Запись.ЗаписатьНачалоОбъекта(); Запись.ЗаписатьИмяСвойства("TypeCode"); Запись.ЗаписатьЗначение(Строка(СтрокаТЗ.Ссылка.УникальныйИдентификатор())); Запись.ЗаписатьИмяСвойства("ProductManagers"); ЗаписьПродактМенеджер = Новый ЗаписьJSON; ЗаписьПродактМенеджер.УстановитьСтроку(ПараметрыJSON); ЗаписьПродактМенеджер.ПроверятьСтруктуру = Истина; //Начало_Массив_2 ЗаписьПродактМенеджер.ЗаписатьНачалоМассива(); Пока ВыборкаДетальныеЗаписиПродактМенеджер.Следующий() Цикл ЗаписьПродактМенеджер.ЗаписатьНачалоОбъекта(); ЗаписьПродактМенеджер.ЗаписатьИмяСвойства("FIO"); ЗаписьПродактМенеджер.ЗаписатьЗначение(СокрЛП(ВыборкаДетальныеЗаписиПродактМенеджер.СсылкаПользователь.Наименование)); ЗаписьПродактМенеджер.ЗаписатьИмяСвойства("UnitUsed"); ЗаписьПродактМенеджер.ЗаписатьЗначение(ВыборкаДетальныеЗаписиПродактМенеджер.Актуален); ЗаписьПродактМенеджер.ЗаписатьКонецОбъекта(); КонецЦикла; ЗаписьПродактМенеджер.ЗаписатьКонецМассива(); СтрокаJSONПродактМенеджер = ЗаписьПродактМенеджер.Закрыть(); Запись.ЗаписатьЗначение(СтрокаJSONПродактМенеджер); Запись.ЗаписатьКонецОбъекта(); КонецЦикла; Запись.ЗаписатьКонецМассива(); СтрокаJSON = Запись.Закрыть(); | ||
vyaz 1 - 19.09.16 - 15:41 | Используй сериализацию в JSON, т.е. создай свою структуру с массивами и сериализуй. | ||
Torquader 2 - 19.09.16 - 16:13 | Самое простое - сформировать строку через текст - и не задаваться, что там и как получается - массив массивов - это когда две открывающихся скобочки. | ||
Рэйв 3 - 19.09.16 - 16:15 | (0)Дерево изобретаешь? | ||
Fragster 4 - 19.09.16 - 16:17 | (1) прав | ||
Alex unde 5 - 19.09.16 - 16:22 | (0) Дай пример желаемого валидного JSON-a, не очень большого, но который бы отображал все твои потребности в данном вопросе | ||
dsdred 6 - 19.09.16 - 16:23 | (3) Да дерево, определенной структуры (1) Мне нужно вернуть без всяких ненужных вещей типа "#type":"jv8:Structure"(2) хочется использовать механизм платформы | ||
dsdred 7 - 19.09.16 - 16:26 | (5) [{"TypeCode":"6ec2b5f4-accd-11e5-80ef-00155d01d522","TypeName":"Обучение по курсу","ParentCode":"2cdea8c7-accd-11e5-80ef-00155d01d522","TypeUsed":true,"ProductManagers":[],"PurchasingManager":[{"MPortalCode":1421,"MFIO":"Дейнеко Андрей Валентинович","MUnitUsed":true}]},{"TypeCode":"798e06c3-c4d3-11e5-80f3-00155d01d522","TypeName":"Компьютеры","ParentCode":"","TypeUsed":true,"ProductManagers":[],"PurchasingManager":[]},{"TypeCode":"82a1c8af-c4d3-11e5-80f3-00155d01d522","TypeName":"Ноутбуки, КПК и планшетные устройства","ParentCode":"","TypeUsed":true,"ProductManagers":[],"PurchasingManager":[]}] | ||
dsdred 8 - 19.09.16 - 16:27 | (7) тут 3 элемента массива. начальный элемент "TypeCode" | ||
Alex unde 9 - 19.09.16 - 16:32 | Может будет полезным вот такой кусок кода, а пока подумаю над твоим вариантом
Функция ПолучитьМассивТекстовПостЗапроса(КолВПачке = 500) МассивТекстовSJON = Новый Массив; РезультатЗапроса = Результат_Каталоги(); Выборка = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); РезКолонки = РезультатЗапроса.Колонки; Колонки = Новый Массив; Для Каждого Кол Из РезКолонки Цикл Если Не Кол.Имя = "Группировка" Тогда  //"Группировка" - техническая колонка, которую передаватьв JSON не нужно Колонки.Добавить(Кол.Имя); КонецЕсли; КонецЦикла; ПарамЗаписи = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, , Истина, ЭкранированиеСимволовJSON.СимволыВнеASCII, Ложь, Ложь, Ложь, Ложь); КолСтрОбр = 0; КолСтрВсего = Выборка.Количество(); Пока КолСтрВсего > КолСтрОбр Цикл ВсеЗаписиJSON = Новый ЗаписьJSON; ВсеЗаписиJSON.ПроверятьСтруктуру = Истина; ВсеЗаписиJSON.УстановитьСтроку(ПарамЗаписи); МассивВсего = Новый Массив; Пока Выборка.Следующий() Цикл СтруктураJSON = Новый Структура; Для Каждого Кол Из Колонки Цикл Если Не Выборка[Кол] = NULL Тогда СтрЗнач = СокрЛП(Формат(Выборка[Кол], "ЧГ=0")); СтруктураJSON.Вставить(Кол, СтрЗнач); КонецЕсли; КонецЦикла; Масс = Новый Массив; ВыборкаДет = Выборка.Выбрать();  //Записываем дополнительные свойства Пока ВыборкаДет.Следующий() Цикл МассОпций = Новый Массив; МассОпций.Добавить(Новый Структура("option", СокрЛП(Формат(ВыборкаДет.options, "ЧГ=0")))); СтруктураJSON.Вставить("options", МассОпций); КонецЦикла; МассивВсего.Добавить(СтруктураJSON); КолСтрОбр = КолСтрОбр + 1; Если КолСтрОбр % КолВПачке = 0 Тогда Прервать; КонецЕсли; КонецЦикла; ЗаписатьJSON(ВсеЗаписиJSON, Новый Структура(ТочкаВхода, МассивВсего)); МассивТекстовSJON.Добавить(ВсеЗаписиJSON.Закрыть()); КонецЦикла; Возврат МассивТекстовSJON; КонецФункции | ||
Evpatiy 10 - 19.09.16 - 16:36 | Запись.ЗаписатьНачалоОбъекта(); Запись.ЗаписатьИмяСвойства("String"); Запись.ЗаписатьЗначение("Это свойтво строка"); Запись.ЗаписатьИмяСвойства("Array"); Запись.ЗаписатьНачалоМассива(); Для Каждого ЭлементМассива Из МойМасси Цикл Запись.ЗаписатьНачалоОбъекта(); Запись.ЗаписатьИмяСвойства("Name"); Запись.ЗаписатьЗначение(ЭлементМассива.Имя); Запись.ЗаписатьКонецОбъекта(); КонецЦикла Запись.ЗаписатьКонецМассива(); Запись.ЗаписатьКонецОбъекта(); | ||
Evpatiy 11 - 19.09.16 - 16:39 | (10) В результате будет:
{ "String": "Это свойство строка", "Array": [ {"Name": "Имя1"}, {"Name": "Имя2"}, {"Name": "Имя3"}] } | ||
Alex unde 12 - 19.09.16 - 16:41 | Как по мне - так удобней. Помогло?
ПарамЗаписи = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто,Символы.Таб , Истина, ЭкранированиеСимволовJSON.СимволыВнеASCII, Ложь, Ложь, Ложь, Ложь); ВсеЗаписиJSON = Новый ЗаписьJSON; ВсеЗаписиJSON.ПроверятьСтруктуру = Истина; ВсеЗаписиJSON.УстановитьСтроку(ПарамЗаписи); МассивВсего = Новый Массив; СтруктураJSON = Новый Структура; СтруктураJSON.Вставить("TypeCode", "6ec2b5f4-accd-11e5-80ef-00155d01d522"); СтруктураJSON.Вставить("TypeName", "Обучение по курсу"); СтруктураJSON.Вставить("ParentCode", "2cdea8c7-accd-11e5-80ef-00155d01d522"); СтруктураJSON.Вставить("TypeUsed", true); СтруктураJSON.Вставить("ProductManagers", Новый Массив); ДопСтруктура = Новый Структура; ДопСтруктура.Вставить("MPortalCode", 1421); ДопСтруктура.Вставить("MFIO", "Дейнеко Андрей Валентинович"); ДопСтруктура.Вставить("MUnitUsed", true); ДопМассив = Новый Массив; ДопМассив.Добавить(ДопСтруктура); СтруктураJSON.Вставить("PurchasingManager", ДопМассив); МассивВсего.Добавить(СтруктураJSON); ЗаписатьJSON(ВсеЗаписиJSON, МассивВсего); Сообщить(ВсеЗаписиJSON.Закрыть()); | ||
Evpatiy 13 - 19.09.16 - 16:46 | (12) Много лишних объектов создается. | ||
Alex unde 14 - 19.09.16 - 16:46 | |||
dsdred 15 - 19.09.16 - 16:47 | (12) Сейчас посмотрим | ||
dsdred 16 - 19.09.16 - 16:49 | (11)
Задачка именно массив в массиве, а не 1 масив { "String": "Это свойство строка", "Array1": [ {"Name": "Имя1"}, {"Name": "Имя2"}, {"Array2": [ {"Name": "Имя1"}, {"Name": "Имя2"}]} ]} | ||
Evpatiy 17 - 19.09.16 - 16:54 | (16)
<code> Запись.ЗаписатьНачалоМассива(); Для Каждого ЭлементМассива Из МойМассив Цикл Запись.ЗаписатьНачалоМассива(); Для Каждого ЭлементМассива Из МойМасси Цикл Запись.ЗаписатьНачалоОбъекта(); Запись.ЗаписатьИмяСвойства("Name"); Запись.ЗаписатьЗначение(ЭлементМассива.Имя); Запись.ЗаписатьКонецОбъекта(); КонецЦикла Запись.ЗаписатьКонецМассива(); КонецЦикла Запись.ЗаписатьКонецМассива(); </code>Только это уже не json. | ||
Evpatiy 18 - 19.09.16 - 16:57 | (17) Получите
[ [{"Name": "Имя11"}, {"Name": "Имя12"}], [{"Name": "Имя21"}, {"Name": "Имя22"}], [{"Name": "Имя31"}, {"Name": "Имя32"}]] | ||
Alex unde 19 - 19.09.16 - 16:58 | (13) Только что замерял 82 070 - количество записей в выборке 19.09.2016 16:53:46 - начало формирования текстов JSON 19.09.2016 16:53:55 - конец 165 - количество пачек, по 500 единиц в пачке | ||
Evpatiy 20 - 19.09.16 - 17:12 | (19) Какое отношение это имеет к количеству лишних объектов? | ||
Alex unde 21 - 19.09.16 - 17:16 | |||
dsdred 22 - 19.09.16 - 17:16 | (19)Большое спасибо, получилось. Пугают только записи "FIO": "\u0422\u0440\u044B\u043D\u043A\u043E\u0432\u0441\u043A\u0438\u0439 \u0421\u0435\u043C\u0451\u043D \u0421\u0435\u0440\u0433\u0435\u0435\u0432\u0438\u0447" При этом 1с-ко нормально считываю, а не 1с прочитают? Отрабатывает довольно таки шустро. | ||
Evpatiy 23 - 19.09.16 - 17:18 | (21) Создается много объектов. Создаются массивы, структуры. Потом эти объекты заполняются, потом сериализуются. Это же лишняя нагрузка. Можно в один проход сразу записать в ЗаписьJSON, без создания, заполнения и преобразования дополнительных объектов. | ||
Alex unde 24 - 19.09.16 - 17:20 | (22) Это экранирование символов.
"ЭкранированиеСимволовJSON.СимволыВнеASCII" в параметрах эта штуковина отвечает за экранизацию. Если нет необходимости экранировать, поставь там "нет" | ||
dsdred 25 - 19.09.16 - 17:22 | (24) Огромное спасибо | ||
Alex unde 26 - 19.09.16 - 17:25 | (25) Обращайтесь :) | ||
vyaz 27 - 19.09.16 - 18:35 | Автор не майся куйней, то что тебе надо по твоей же ссылке про Иванова с телефонами. Строка для поиска в тексте "А пример сериализации (записи) в JSON может выглядеть так:" |
|
Список тем форума
|