|
JSON массив массивов | ☑ | ||
---|---|---|---|---|
0
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 = Запись.Закрыть(); |
|||
1
vyaz
19.09.16
✎
15:41
|
Используй сериализацию в JSON, т.е. создай свою структуру с массивами и сериализуй.
|
|||
2
Torquader
19.09.16
✎
16:13
|
Самое простое - сформировать строку через текст - и не задаваться, что там и как получается - массив массивов - это когда две открывающихся скобочки.
|
|||
3
Рэйв
19.09.16
✎
16:15
|
(0)Дерево изобретаешь?
|
|||
4
Fragster
гуру
19.09.16
✎
16:17
|
(1) прав
|
|||
5
Alex unde
19.09.16
✎
16:22
|
(0) Дай пример желаемого валидного JSON-a, не очень большого, но который бы отображал все твои потребности в данном вопросе
|
|||
6
dsdred
19.09.16
✎
16:23
|
(3) Да дерево, определенной структуры
(1) Мне нужно вернуть без всяких ненужных вещей типа "#type":"jv8:Structure" (2) хочется использовать механизм платформы |
|||
7
dsdred
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":[]}] |
|||
8
dsdred
19.09.16
✎
16:27
|
(7) тут 3 элемента массива. начальный элемент "TypeCode"
|
|||
9
Alex unde
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; КонецФункции |
|||
10
Evpatiy
19.09.16
✎
16:36
|
Запись.ЗаписатьНачалоОбъекта();
Запись.ЗаписатьИмяСвойства("String"); Запись.ЗаписатьЗначение("Это свойтво строка"); Запись.ЗаписатьИмяСвойства("Array"); Запись.ЗаписатьНачалоМассива(); Для Каждого ЭлементМассива Из МойМасси Цикл Запись.ЗаписатьНачалоОбъекта(); Запись.ЗаписатьИмяСвойства("Name"); Запись.ЗаписатьЗначение(ЭлементМассива.Имя); Запись.ЗаписатьКонецОбъекта(); КонецЦикла Запись.ЗаписатьКонецМассива(); Запись.ЗаписатьКонецОбъекта(); |
|||
11
Evpatiy
19.09.16
✎
16:39
|
(10) В результате будет:
{ "String": "Это свойство строка", "Array": [ {"Name": "Имя1"}, {"Name": "Имя2"}, {"Name": "Имя3"} ] } |
|||
12
Alex unde
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.Закрыть()); |
|||
13
Evpatiy
19.09.16
✎
16:46
|
(12) Много лишних объектов создается.
|
|||
14
Alex unde
19.09.16
✎
16:46
|
(12) Останется только подстроить свой результат выборки так, чтобы у тебя все в нужные места попадало...
(9) - этот код выборку на пачки разбивает, и возвращает массив готовых текстов и экранированных для сайта |
|||
15
dsdred
19.09.16
✎
16:47
|
(12) Сейчас посмотрим
|
|||
16
dsdred
19.09.16
✎
16:49
|
(11)
Задачка именно массив в массиве, а не 1 масив { "String": "Это свойство строка", "Array1": [ {"Name": "Имя1"}, {"Name": "Имя2"}, {"Array2": [ {"Name": "Имя1"}, {"Name": "Имя2"}]} ] } |
|||
17
Evpatiy
19.09.16
✎
16:54
|
(16)
<code> Запись.ЗаписатьНачалоМассива(); Для Каждого ЭлементМассива Из МойМассив Цикл Запись.ЗаписатьНачалоМассива(); Для Каждого ЭлементМассива Из МойМасси Цикл Запись.ЗаписатьНачалоОбъекта(); Запись.ЗаписатьИмяСвойства("Name"); Запись.ЗаписатьЗначение(ЭлементМассива.Имя); Запись.ЗаписатьКонецОбъекта(); КонецЦикла Запись.ЗаписатьКонецМассива(); КонецЦикла Запись.ЗаписатьКонецМассива(); </code> Только это уже не json. |
|||
18
Evpatiy
19.09.16
✎
16:57
|
(17) Получите
[ [{"Name": "Имя11"}, {"Name": "Имя12"}], [{"Name": "Имя21"}, {"Name": "Имя22"}], [{"Name": "Имя31"}, {"Name": "Имя32"}] ] |
|||
19
Alex unde
19.09.16
✎
16:58
|
(13) Только что замерял
82 070 - количество записей в выборке 19.09.2016 16:53:46 - начало формирования текстов JSON 19.09.2016 16:53:55 - конец 165 - количество пачек, по 500 единиц в пачке |
|||
20
Evpatiy
19.09.16
✎
17:12
|
(19) Какое отношение это имеет к количеству лишних объектов?
|
|||
21
Alex unde
19.09.16
✎
17:16
|
(20) думал что намек на производительность..
если не на неё, то в чем реальная проблема тогда? |
|||
22
dsdred
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с прочитают? Отрабатывает довольно таки шустро. |
|||
23
Evpatiy
19.09.16
✎
17:18
|
(21) Создается много объектов. Создаются массивы, структуры. Потом эти объекты заполняются, потом сериализуются. Это же лишняя нагрузка. Можно в один проход сразу записать в ЗаписьJSON, без создания, заполнения и преобразования дополнительных объектов.
|
|||
24
Alex unde
19.09.16
✎
17:20
|
(22) Это экранирование символов.
"ЭкранированиеСимволовJSON.СимволыВнеASCII" в параметрах эта штуковина отвечает за экранизацию. Если нет необходимости экранировать, поставь там "нет" |
|||
25
dsdred
19.09.16
✎
17:22
|
(24) Огромное спасибо
|
|||
26
Alex unde
19.09.16
✎
17:25
|
(25) Обращайтесь :)
|
|||
27
vyaz
19.09.16
✎
18:35
|
Автор не майся куйней, то что тебе надо по твоей же ссылке про Иванова с телефонами. Строка для поиска в тексте "А пример сериализации (записи) в JSON может выглядеть так:"
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |