Чтение и запись в формате JSON

Печать (Ctrl+P)
 Одна из проблем ( или неудобств) работы в формате JSON  связана с преобразованием строки в дату.   На помощь этой проблемы, без необходимости написания собственных функций преобразований,  приходят  функции глобального контекста :
  1. ЗаписатьДатуJSON(<Дата>, <Формат>, <ВариантЗаписиДаты>)  – Преобразовывает дату в строку для последующей записи в формат JSON
  2. ПрочитатьДатуJSON(<Строка>, <Формат>) –  
    Выполняет преобразование строки, прочитанной в JSON-формате, в значение типа Дата.
 Главное – записать дату в том же формате ФорматДатыJSON , в котором будете прочитать.  Формат, в котором представлена дата в строке, подлежащей преобразованию имеет следующие значения:
    • ФорматДатыJSON.ISO – формат вида: “ГГГГ-ММ-ДДTЧЧ:ММ:ССZ”, Например: “2009-02-15T00:00:00Z”.
    • ФорматДатыJSON.JavaScript  – формат вида : “1234656000000”.
    • ФорматДатыJSON.Microsoft – Формат вида: “/Date(123456000000)/”.

Более  подробный теоретический материал  о работе в формате  JSON можно  прочитать  здесь 

Для демонстрации механизм чтения и записи в формате Json   я создал  обработку  выгрузки  и загрузки документа “Заявки” на ремонт оборудования (См рис 1).

Рис 1 Обработка демонстрации чтения и записи JSONЭти Заявки создаются в пункте приема оборудования различных граждан. Оборудование  курьером ( доверенным лицом или представителем )  оправляется к  исполнителю ( авторизированному  сервисному центру, далее АСЦ). В заявке указываются данные оборудования и его  владельца для открытия  заказ-наряда в  АСЦ.

Программный код  процедуры  записи заявки  в текстовом файле в формате JSON  показан в следующем фрагменте модуля управляемой формы обработки ( Для  упрощения демонстрации примера сокращены количество выгружаемых данных ) :

&НаСервере
Процедура ВыгрузитьНаСервере(Заявка,Папка)
ПолноеИмяФайла =	 Папка+ "Заявка_"+Заявка.Номер+".txt";
ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, " ", Истина);
Запись = Новый ЗаписьJSON;
Запись.ПроверятьСтруктуру = Истина;
Запись.ОткрытьФайл(ПолноеИмяФайла, , , ПараметрыJSON);
Запись.ЗаписатьНачалоОбъекта();
//записываем Номер и  дата заявки
Запись.ЗаписатьИмяСвойства("ДатаЗаявки");
Запись.ЗаписатьЗначение(ЗаписатьДатуJSON(Заявка.Дата, ФорматДатыJSON.ISO, ВариантЗаписиДатыJSON.УниверсальнаяДата));
Запись.ЗаписатьИмяСвойства("НомерЗаявки");
Запись.ЗаписатьЗначение(Заявка.Номер);
//Записываем данные Представителя (данные  сокращены до ссылки и наименования)
Запись.ЗаписатьИмяСвойства("Представитель");
ОписаниеПредставителя = Новый Структура("Ссылка,Наименование");
ОписаниеПредставителя.Ссылка = Строка(Заявка.Представитель.УникальныйИдентификатор());
ОписаниеПредставителя.Наименование = Заявка.Представитель.Наименование;
ЗаписатьJSON(Запись,ОписаниеПредставителя);
// Записываем данные  Исполнителя заявки ((данные сокращены до ссылки и наименования)  
Запись.ЗаписатьИмяСвойства("Исполнитель");
ОписаниеИсполнителя = Новый Структура("Ссылка,Наименование");
ОписаниеИсполнителя.Ссылка = Строка(Заявка.Исполнитель.УникальныйИдентификатор());
ОписаниеИсполнителя.Наименование = Заявка.Исполнитель.Наименование;
ЗаписатьJSON(Запись,ОписаниеИсполнителя);
// Записываем данные табличной части заявки - данные оборудования и его владельца сокращены 
Запись.ЗаписатьИмяСвойства("ФизическиеЛица");
ФизическиеЛица = Новый Массив;
Для каждого СтрокаТабличнойчасти Из Заявка.Оборудования Цикл
    ОписаниеЗаказа = Новый Структура("ФИОСсылка,ФИО,ДатаРождения");
    ОписаниеЗаказа.ФИОСсылка = Строка(СтрокаТабличнойчасти.ФизическоеЛицо.УникальныйИдентификатор());
    ОписаниеЗаказа.ФИО = Строка(СтрокаТабличнойчасти.ФизическоеЛицо);
    ОписаниеЗаказа.ДатаРождения =ЗаписатьДатуJSON(СтрокаТабличнойчасти.ФизическоеЛицо.ДатаРождения, ФорматДатыJSON.ISO, ВариантЗаписиДатыJSON.УниверсальнаяДата);
    ФизическиеЛица.Добавить(ОписаниеЗаказа);
КонецЦикла;
ЗаписатьJSON(Запись, ФизическиеЛица);
Запись.ЗаписатьКонецОбъекта();
Сообщить("Создан файл "+ ПолноеИмяФайла);
Запись.Закрыть();
КонецПроцедуры

Обратите внимание, что для записи  данных типа даты я использую метод глобального контекста языка 1С ЗаписатьДатуJSON 

Созданный текстовый файл выгрузки в формате JSON  выгладит в следующем образом:

Рис 2 Текстjdsq файл в формате JSON

Загрузка этого файла выполняется на закладке Загрузка созданной для этой цели обработки (см рис :

Рис 3 Обработка демонстрации чтения и записи JSON

Обработанные  данные после чтения я записываю в табличный документ для проверки распознавания данных. Программный код чтения файла показан в следующем фрагменте:

 

&НаСервере
Процедура ЗагрузитьНаСервере(ИмяФайлаЗагрузки)
Чтение = Новый ЧтениеJSON;
Чтение.ОткрытьФайл(ИмяФайлаЗагрузки);
Реквизиты = Новый Массив;
Реквизиты.Добавить("ДатаЗаявки");
Реквизиты.Добавить("ДатаРождения");
Данные = ПрочитатьJSON(Чтение, Ложь,Реквизиты,ФорматДатыJSON.ISO);
Чтение.Закрыть();
ДатаЗаявки = Данные.ДатаЗаявки;
НомерЗаявки = Данные.НомерЗаявки;
Представитель = Данные.Представитель.Наименование;
Испольнитель = Данные.Исполнитель.Наименование;
ТаблицаЗаказов.Очистить();
Для каждого Стр Из Данные.ФизическиеЛица Цикл
ЗаполнитьЗначенияСвойств(ТаблицаЗаказов.Добавить(),Стр);
КонецЦикла;
КонецПроцедуры

В этом фрагменте программного  кода чтения следует обратить внимание на то,  что я нигде не использую метод   ПрочитатьДатуJSON для  строки, прочитанной в JSON-формате, в значение типа Дата.   Дело в том, что  в параметрах метода ПрочитатьJSON   я передаю массив реквизитов,  которые нужно преобразовать  в дату  из формата ФорматДатыJSON.ISO : 

Данные = ПрочитатьJSON(Чтение, Ложь,Реквизиты,ФорматДатыJSON.ISO);

В более сложных задачах выгрузки возможно  потребуется использовать функции восстановления  чтения данных, например:

Данные = ПрочитатьJSON(Чтение, Ложь,,,"ФункцияВосстановленияЧтения",ЭтотОбъект,Реквизиты);

В данном  случае ,  преобразование  даты из строки осуществляется в функции восстановления ФункцияВосстановленияЧтения 

&НаКлиенте
Функция ФункцияВосстановленияЧтения(Свойство, Значение, ДополнительныеПараметры) Экспорт
Возврат ПрочитатьДатуJSON(Значение, ФорматДатыJSON.ISO );
КонецФункции

 

Данная функция вызывается при чтении каждого свойства и должна иметь следующие параметры:

  • <Свойство> – значение типа Строка, указывается только при чтении объектов JSON,
  • <Значение> – значение допустимого для сериализации типа,
  • <ДополнительныеПараметры>.

Теоретический материал  о работе в формате  JSON можно  прочитать  здесь 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *