Работа с форматом JSON в 1С - 1С-ИнтеГрация

Работа с форматом JSON в 1С



При обмене данными с веб-сайтами зачастую используется формат JSON. К сожалению, в 1С нет стандартных процедур для работы с данным форматом. В процессе реализации одного из проектов мной был разработан ряд процедур и функций облегчающих жизнь программисту 1С при работе с данными в формате JSON. 

По сути, при работе с JSON требуется две операции: сформировать строку JSON (например, для передачи параметров на веб-сервер в формате JSON из 1С) и прочитать данные из строки JSON (например, когда мы получаем ответ от веб-сервера в формат JSON). Так как формат JSON в упрощенном виде представляет собой набор параметров в виде <ИмяПараметра>:<ЗначениеПараметра> то для работы с JSON в 1С мной был использован тип "Структура". Т.е. процедура чтения данных из формата JSON преобразует строку JSON в тип 1С "Структура". Так же и строка JSON в 1С формируется из структуры. Т.о. чтобы сформировать строку JSON сначала необходимо заполнить структуру необходимыми значениями, а потом вызвать функцию, преобразующую структуру в JSON. Позднее функционал функции формирования строки JSON был расширен - теперь в JSON может быть преобразован массив и таблица значений. При желании можно доработать функцию так, чтобы она "понимала" и другие типы. Такие как "Cоответствие", "ДеревоЗначений" и др. На практике это редко может пригодиться, поэтому сам я этого делать не стал. 

А теперь подробней о том, как работать с функциями преобразования JSON.
 

Преобразование строки JSON в структуру 1С. 
Для преобразования строки JSON в структуру 1С служит функция ЗаполнитьСтруктуруИзJSON(). 

Код 1C v 8.х

 Функция ЗаполнитьСтруктуруИзJSON(<ТекстJON>)   


<ТекстJSON> (обязательный) - строка в формате JSON, 
которую необходимо преобразовать в структуру. 

Возвращаемое значение. 
Тип Структура. 
Имя значения задается в структуре как Ключ, а само значение, соответственно, как значение. Поддерживаются также вложенные значение ("{}" в "{}") и массивы. В таких случаях тип значения будет Структура и Массив соответственно. Если у в JSON задан только массив, то сформируется структура с одним элементом с ключом "Значение" и типом "Массив". Ниже приведены поясняющие примеры: 

Код 1C v 8.х

 СтрокаJSON = "{""server"":""10234"",""user"":""3745"",""hash"":""8263ad83ce""}";
Результат = ЗаполнитьСтруктуруИзJSON(СтрокаJSON);
 
Сообщить("server:" + Результат.server + "
    |user:" + Результат.user + "
    |hash:" + Результат.hash);
 
 
// пример значений с массивом
СтрокаJSON = "{""server"":""10234"",""users"":[""3745"",""7462"",""2374""],""hash"":
""8263ad83ce""}";
Результат = ЗаполнитьСтруктуруИзJSON(СтрокаJSON);
 
Сообщить("server:" + Результат.server + "
    |hash:" + Результат.hash);
 
для каждого user ИЗ Результат.users Цикл
  Сообщить("user: " + user);
КонецЦикла;
 
// еще один пример значений с массивом
СтрокаJSON = "{""server"":""10234"",""users"":[{""id"":""3745"",""name"":""Jack""},
{""id"":""7462"",""name"":""Nick""}]}";
Результат = ЗаполнитьСтруктуруИзJSON(СтрокаJSON);
 
Сообщить("server:" + Результат.server);
 
для каждого user Из Результат.users Цикл
  Сообщить("user id: " + user.id +
        ", user name: " + user.name);
КонецЦикла;
 
// только массив
СтрокаJSON = "[""Nissan"",""Ford"",""Audi""]";
Результат = ЗаполнитьСтруктуруИзJSON(СтрокаJSON);
 
для каждого Авто Из Результат.Значение Цикл
  Сообщить(Авто);
КонецЦикла;   



Следует заметить, что все значения заполняются как строковые (тип "Строка"). Последующее преобразование (например, к числу) лежит на самом разработчике. 

Формирование строки JSON в 1С. 
Для формирования строки в формате JSON в 1С предназначена функция СформироватьСтрокуJSON(). 

Код 1C v 8.х

 Функция СформироватьСтрокуJSON(<Объект>)    


<Объект> (обязательный) - объект, который необходимо 
преобразовать в формат JSON. Может иметь тип "Структура", 
"Массив" или "ТаблицаЗначений". 
Если Объект имеет тип "ТаблицаЗначений", то она рассматривается как массив из структур, соответствующих колонкам ТЗ. Все значения приводятся к строковому типу, дата приводится в формат unixtime, значение типа булево "Истина" преобразуется в строку "true", а "Ложь" - в "false, прочие объекты просто преобразуются как "Строка(Объект)". 

Ниже приведены поясняющие примеры. 

Код 1C v 8.х

 ////////////////////////////////////////////////////////
// преобразование простой структуры
Данные = Новый Структура("server,user,hash",
            10234, 3745, "8263ad83ce");
СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры(Данные);
// результатом будет строка
// {"server":"10234","user":"3745","hash":"8263ad83ce"} 
 
////////////////////////////////////////////////////////
// преобразования массива
Данные = Новый Массив;
Данные.Добавить("Nissan");
Данные.Добавить("Ford");
Данные.Добавить("Audi");
 
СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры(Данные);
// результатом будет строка
// ["Nissan","Ford","Audi"] 
 
////////////////////////////////////////////////////////
// преобразование сложной структуры
Данные = Новый Структура;
Данные.Добавить("server", 10234);
Данные.Добавить("users", Новый Массив);
Данные.Добавить("hash", "8263ad83ce");
 
Данные.users.Добавить(3745);
Данные.users.Добавить(7462);
Данные.users.Добавить(2374);
 
СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры(Данные);
// результатом будет строка
// {"server":"10234","users":["3745","7462","2374"],"hash":"8263ad83ce"}
 
////////////////////////////////////////////////////////
// еще один пример массива
Данные = Новый Структура;
Данные.Вставить("server", 10234);
Данные.Вставить("users", Новый Массив);
 
Данные.users.Добавить(Новый Структура("id,name", 3745, "Jack"));
Данные.users.Добавить(Новый Структура("id,name", 7246, "Nick"));
 
СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры(Данные);
// результатом будет строка
// {"server":"10234","users":[{"id":"3745","name":"Jack"},{"id":"7462","name":"Nick"}]}
 
////////////////////////////////////////////////////////
// преобразование таблицы значений
ТаблПользователей = Новый ТаблицаЗначений;
ТаблПользователей.Колонки.Добавить("id");
ТаблПользователей.Колонки.Добавить("name");
 
НоваяСтрока = ТаблПользователей.Добавить();
НоваяСтрока.id = 3276;
НоваяСтрока.name = "Jack";
 
НоваяСтрока = ТаблПользователей.Добавить();
НоваяСтрока.id = 3276;
НоваяСтрока.name = "Nick";
 
СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры(Данные);
// результатом будет строка
// [{"id":"3745","name":"Jack"},{"id":"7462","name":"Nick"}]   

 



Назад в раздел