Для того чтобы выполнить потоковую запись JSON-документа, необходимы записываемые данные и объект ЗаписьJSON.
Допустим, нам нужно записать в JSON-документ некоторый объект, обладающий свойствами Код, Наименование, Телефоны (массив строк), ОбъемПродаж, Поставщик.
Один JSON-файл содержит одно значение. Это то самое значение, о котором говорилось выше: объект, массив, строка, число или один из литералов. Поэтому записываем в JSON наш объект следующим образом (листинг 1.1).
Листинг 1.1. Пример потоковой записи JSON-документа
&НаСервереБезКонтекста
Процедура ПотоковаяЗаписьНаСервере()
// Создать объект записи и открыть файл, в который будет выполняться запись.
Запись = Новый ЗаписьJSON;
Запись.ОткрытьФайл("c:\temp\streamWrite.json", , , Новый ПараметрыЗаписиJSON(, Символы.Таб));
// Выполнить запись значений с помощью объекта записи (Запись).
// Записать начало нашего объекта.
Запись.ЗаписатьНачалоОбъекта();
// Заполнить свойство Код типа Строка.
Запись.ЗаписатьИмяСвойства("Код");
Запись.ЗаписатьЗначение("000000017");
// Заполнить свойство Наименование типа Строка.
Запись.ЗаписатьИмяСвойства("Наименование");
Запись.ЗаписатьЗначение("ОАО Топаз");
// Заполнить свойство Телефоны типа Массив.
// Поэтому после имени свойства записываем массив, состоящий из значений – строк.
Запись.ЗаписатьИмяСвойства("Телефоны");
Запись.ЗаписатьНачалоМассива();
Запись.ЗаписатьЗначение("8-999-777-55-33");
Запись.ЗаписатьЗначение("+71112223344");
Запись.ЗаписатьКонецМассива();
// Заполнить свойство ОбъемПродаж типа Число.
Запись.ЗаписатьИмяСвойства("ОбъемПродаж");
Запись.ЗаписатьЗначение(5000000);
// Заполнить свойство Поставщик типа Булево.
Запись.ЗаписатьИмяСвойства("Поставщик");
Запись.ЗаписатьЗначение(Ложь);
// Записать конец нашего объекта.
Запись.ЗаписатьКонецОбъекта();
// Завершить работу с файлом.
Запись.Закрыть();
КонецПроцедуры
Содержимое процедуры понятно из комментариев в тексте листинга. Поэтому не будем еще раз на этом останавливаться. Про параметры записи JSON, переданные четвертым параметром в метод ОткрытьФайл(), будет рассказано ниже, в разделе «».
В результате сформированный JSON-документ будет иметь следующий вид (листинг 1.2).
Листинг 1.2. Содержимое JSON-документа
{
"Код": "000000017",
"Наименование": "ОАО Топаз",
"Телефоны": [
"8-999-777-55-33",
"+71112223344"
],
"ОбъемПродаж": 5000000,
"Поставщик": false
}
Теперь представим, что мы хотим записать не какой-то абстрактный объект, а объект, обладающий собственным именем – Контрагент1. Возможно, вместе с ним мы захотим записать и другой аналогичный объект с именем Контрагент2. Как поместить это в один JSON-файл?
Поскольку, как мы говорили, JSON-файл может содержать только одно значение, мы запишем в него корневой объект с единственным свойством. Имя этого свойства – это имя нашего объекта, а значение этого свойства – это совокупность свойств, которыми обладает наш объект (листинг 1.3).
Листинг 1.3. Пример потоковой записи JSON-документа
&НаСервереБезКонтекста
Процедура ПотоковаяЗаписьНаСервере()
// Создать объект записи и открыть файл, в который будет выполняться запись.
Запись = Новый ЗаписьJSON;
Запись.ОткрытьФайл("c:\temp\streamWrite_2.json", , , Новый ПараметрыЗаписиJSON(, Символы.Таб));
// Выполнить запись значений с помощью объекта записи (Запись).
// Записать начало корневого объекта.
Запись.ЗаписатьНачалоОбъекта();
// Записать имя свойства корневого объекта.
Запись.ЗаписатьИмяСвойства("Контрагент1");
// Записать начало нашего объекта.
Запись.ЗаписатьНачалоОбъекта();
// Заполнить свойство Код типа Строка.
Запись.ЗаписатьИмяСвойства("Код");
Запись.ЗаписатьЗначение("000000017");
// Заполнить свойство Наименование типа Строка.
Запись.ЗаписатьИмяСвойства("Наименование");
Запись.ЗаписатьЗначение("ОАО Топаз");
// Заполнить свойство Телефоны типа Массив.
// Поэтому после имени свойтва записываем массив, состоящий из значений – строк.
Запись.ЗаписатьИмяСвойства("Телефоны");
Запись.ЗаписатьНачалоМассива();
Запись.ЗаписатьЗначение("8-999-777-55-33");
Запись.ЗаписатьЗначение("+71112223344");
Запись.ЗаписатьКонецМассива();
// Заполнить свойство ОбъемПродаж типа Число.
Запись.ЗаписатьИмяСвойства("ОбъемПродаж");
Запись.ЗаписатьЗначение(5000000);
// Заполнить свойство Поставщик типа Булево.
Запись.ЗаписатьИмяСвойства("Поставщик");
Запись.ЗаписатьЗначение(Ложь);
// Записать конец нашего объекта.
Запись.ЗаписатьКонецОбъекта();
// Записать конец корневого объекта.
Запись.ЗаписатьКонецОбъекта();
// Завершить работу с файлом.
Запись.Закрыть();
КонецПроцедуры
В результате сформированный JSON-документ будет иметь следующий вид (листинг 1.4).
Листинг 1.4. Содержимое JSON-документа
{
"Контрагент1": {
"Код": "000000017",
"Наименование": "ОАО Топаз",
"Телефоны": [
"8-999-777-55-33",
"+71112223344"
],
"ОбъемПродаж": 5000000,
"Поставщик": false
}
}
Если требуется записать в этот же файл второй объект Контрагент2, то нам нужно просто добавить к корневому объекту еще одно свойство (Контрагент2) и его значение (листинг 1.5).
Листинг 1.5. Пример потоковой записи JSON-документа
&НаСервереБезКонтекста
Процедура ПотоковаяЗаписьНаСервере()
// Создать объект записи и открыть файл, в который будет выполняться запись.
Запись = Новый ЗаписьJSON;
Запись.ОткрытьФайл("c:\temp\streamWrite_3.json", , , Новый ПараметрыЗаписиJSON(, Символы.Таб));
// Выполнить запись значений с помощью объекта записи (Запись).
// Записать начало корневого объекта.
Запись.ЗаписатьНачалоОбъекта();
// Записать имя первого свойства корневого объекта.
Запись.ЗаписатьИмяСвойства("Контрагент1");
// Записать начало первого объекта.
Запись.ЗаписатьНачалоОбъекта();
…
// Записать конец первого объекта.
Запись.ЗаписатьКонецОбъекта();
// Записать имя второго свойства корневого объекта.
Запись.ЗаписатьИмяСвойства("Контрагент2");
// Записать начало второго объекта.
Запись.ЗаписатьНачалоОбъекта();
…
// Записать конец второго объекта.
Запись.ЗаписатьКонецОбъекта();
// Записать конец корневого объекта.
Запись.ЗаписатьКонецОбъекта();
// Завершить работу с файлом.
Запись.Закрыть();
КонецПроцедуры
В результате сформированный JSON-документ будет иметь следующий вид (листинг 1.6).
Листинг 1.6. Содержимое JSON-документа
{
"Контрагент1": {
"Код": "000000017",
"Наименование": "ОАО Топаз",
"Телефоны": [
"8-999-777-55-33",
"+71112223344"
],
"ОбъемПродаж": 5000000,
"Поставщик": false
},
"Контрагент2": {
"Код": "000000018",
"Наименование": "ОАО Алмаз",
"Телефоны": [
"8-111-222-33-44",
"+78886664422"
],
"ОбъемПродаж": 6000000,
"Поставщик": true
}
}
Потоковое чтение JSON-документа выполняется с помощью объекта ЧтениеJSON. Документ открывается для чтения и поэлементно считывается в цикле. При этом разработчик определяет, что считано, и соответствующим образом обрабатывает считываемые данные.
Простейший вариант чтения JSON-документа может быть выполнен с помощью следующей процедуры (листинг 1.7).
Листинг 1.7. Пример потокового чтения JSON-документа
&НаСервереБезКонтекста
Процедура ПотоковоеЧтениеНаСервере()
Сообщение = Новый СообщениеПользователю;
// Создать объект чтения и открыть файл, из которого будет выполняться чтение.
Чтение = Новый ЧтениеJSON;
Чтение.ОткрытьФайл("c:\temp\streamWrite_2.json");
// Выполнить чтение поэлементно в цикле.
Пока Чтение.Прочитать() Цикл
Если Чтение.ТипТекущегоЗначения = ТипЗначенияJSON.ИмяСвойства Тогда
Сообщение.Текст = "Имя = " + Чтение.ТекущееЗначение;
Сообщение.Сообщить();
КонецЕсли;
Если Чтение.ТипТекущегоЗначения = ТипЗначенияJSON.Булево Или
Чтение.ТипТекущегоЗначения = ТипЗначенияJSON.Строка Или
Чтение.ТипТекущегоЗначения = ТипЗначенияJSON.Число Или
Чтение.ТипТекущегоЗначения = ТипЗначенияJSON.Комментарий Тогда
Сообщение.Текст = "Значение = " + Чтение.ТекущееЗначение;
Сообщение.Сообщить();
КонецЕсли;
КонецЦикла;
// Завершить работу с файлом.
Чтение.Закрыть();
КонецПроцедуры
Результат чтения JSON-документа, содержимое которого показано в листинге 1.4, будет выглядеть следующим образом (рис. 1.1).
Рис. 1.1. Потоковое чтение JSON-документа