JSON -> ДЕРЕВО ЗНАЧЕНИЙ
ВВЕДЕНИЕ
Некоторые уже стали забывать, а некоторые даже и не знали (вот я, например), что JSON - это JavaScript Object Notation, что переводится примерно как "'Запись' объекта в JavaScript". Честно говоря, слово "нотация" вроде как можно и не переводить - оно уже входит в русский язык, но в данном случае это именно "запись", т.е. представление объекта в виде некой структурированной записи - структуры данных, а в данном конкретном случае еще и характерная для JavaScript.
Сейчас JSON используется далеко за пределами JS, парсеры для JSON появились даже в 1С и представляют из себя мало отличимый от персера XML список объектов для повседневного использования.
ПАРСЕР JSON В 1С
Здесь, как и в XML, есть два простых базовых объекта для чтения и записи JSON. Вот они:
Запись = Новый ЗаписьJSON;
Чтение = Новый ЧтениеJSON;
Собственно, работа с этими объектами в обычном повседневном применении проста до безобразия:
// Читаем JSON
Чтение.УстановитьСтроку( СтрокаJSON ); // строка, которая прилетела к вам из какого-нибудь сервиса
ДанныеСтруктура = ПрочитатьJSON( Чтение);
ДанныеСоответствие = ПрочитатьJSON( Чтение, Истина );
// Пишем JSON
Запись.УстановитьСтроку();
ЗаписатьJSON( Запись, ДанныеСтруктура ); // значением может быть простой тип, структура и соответствие
СтрокаJSON = Запись.Закрыть();
JSON в 1С может быть прочитан в структуру или соответствие ("Истина" во втором параметре как раз говорит, чтобы система прочитала данные в соответствие). Также если в данных есть даты, то имена этих полей нужно указать в следующем параметре. Там есть еще некоторое количество параметров, которые могут пригодиться вам, если вдруг вы захотите записать что-то помимо простых типов, массивов, структур, соответствий и их фиксированных вариантов.
При записи JSON может быть преобразован простой тип, структура, соответствие, дата и т.д. = здесь уже не надо заморачиваться со списком полей и видом преобразование. А если вы хотите записать что-то помимо этого, то, опять же, вам помогут дополнительные параметры с указанием функции преобразования.
Надеюсь, что с чтением и записью мы разобрались. Давайте превратим этот набор данных в дерево. Т.е. мы сделаем дерево из структуры (кто хочет - может сделать дерево и из соответствия - даже код менять не нужно).
В ДЕРЕВО!
Ну код тут прост, как три копейки...
&НаСервере
Процедура ПоместитьВДерево( Текст )
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку( Текст );
Данные = ПрочитатьJSON( Чтение );
ЗначениеВРеквизитФормы(
РазвернутьВДерево( РеквизитФормыВЗначение("Дерево"), Данные ),
"Дерево" );
КонецПроцедуры
&НаСервереБезКонтекста
Функция РазвернутьВДерево( Дерево, Данные, Параметр = "" )
Для Каждого Ст ИЗ Данные Цикл
Если ТипЗнч(Ст) = Тип("КлючИЗначение") Тогда
Строка = Дерево.Строки.Добавить();
Строка.Параметр = Ст.Ключ;
Если ТипЗнч(Ст.Значение) = Тип("Структура")
ИЛИ ТипЗнч(Ст.Значение) = Тип("Массив") Тогда
РазвернутьВДерево( Строка, Ст.Значение, Ст.Ключ );
Иначе
Строка.Значение = Ст.Значение
КонецЕсли;
Иначе
Строка = Дерево.Строки.Добавить();
Строка.Параметр = Параметр;
Если ТипЗнч(Ст) = Тип("Структура")
ИЛИ ТипЗнч(Ст) = Тип("Массив") Тогда
РазвернутьВДерево( Строка, Ст, Параметр );
Иначе
Строка.Значение = Ст
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат Дерево
КонецФункции
На выходе у нас что-то типа этого:
Исходный файл вот такой (начало):
{"dox":{"tux":{"res":[{
"part":{"xtd":"320565","godex":{"name":"TE Connectivity"},
"ibo":[{
"hado":{"name":"oxford"},"hubos":[{
[...]
В общем, пробуйте, уважаемые господа-товарищи - обработка прикреплена.
PS: в справке 1С написано, что данный функционал доступен с 8.3.6, но тестировалась обработка на 8.3.18.1289.