Чтение и запись в формате 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):

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

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

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

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

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

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

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

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

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

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

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

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

Previous Article
Next Article

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

Ваш адрес email не будет опубликован.

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.