Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

JSON массив массивов

JSON массив массивов
Я
   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
(12) Останется только подстроить свой результат выборки так, чтобы у тебя все в нужные места попадало...
(9) - этот код выборку на пачки разбивает, и возвращает массив готовых текстов и экранированных для сайта
   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
(20) думал что намек на производительность..
если не на неё, то в чем реальная проблема тогда?
   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 может выглядеть так:"


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует