Имя: Пароль:
1C
1С v8
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 может выглядеть так:"
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс