Примеры работы с форматом json

Примеры работы с форматом json на языке программирования 1С:Предприятие. Примеры позволяют быстро разобраться в вопросе и использовать код в своих разработках

Создание JSON из структуры и соответствия

// Преобразование структуры и соответствия в JSON-строку
Процедура СоздатьJSONИзСтруктуры()

    // Из структуры
    Данные = Новый Структура;
    Данные.Вставить("имя", "Иван");
    Данные.Вставить("возраст", 30);
    Данные.Вставить("активен", Истина);
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, Данные);
    Результат = ЗаписьJSON.Закрыть();
    
    Сообщить("JSON из структуры:");
    Сообщить(Результат);
    
    // Из соответствия
    Соответствие = Новый Соответствие;
    Соответствие.Вставить("город", "Москва");
    Соответствие.Вставить("улица", "Тверская");
    Соответствие.Вставить("дом", 10);
    
    ЗаписьJSON2 = Новый ЗаписьJSON;
    ЗаписьJSON2.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON2, Соответствие);
    Результат2 = ЗаписьJSON2.Закрыть();
    
    Сообщить("JSON из соответствия:");
    Сообщить(Результат2);
    
КонецПроцедуры

Создание JSON из массива и списка значений

// Преобразование массива и списка значений в JSON-массив
Процедура СоздатьJSONИзМассива()

    // Из массива
    Массив = Новый Массив;
    Массив.Добавить("Первый");
    Массив.Добавить("Второй");
    Массив.Добавить(123);
    Массив.Добавить(Истина);
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, Массив);
    Результат = ЗаписьJSON.Закрыть();
    
    Сообщить("JSON из массива:");
    Сообщить(Результат);
    
    // Из массива структур
    Товары = Новый Массив;
    
    Товар1 = Новый Структура;
    Товар1.Вставить("наименование", "Ноутбук");
    Товар1.Вставить("цена", 50000);
    Товары.Добавить(Товар1);
    
    Товар2 = Новый Структура;
    Товар2.Вставить("наименование", "Монитор");
    Товар2.Вставить("цена", 15000);
    Товары.Добавить(Товар2);
    
    ЗаписьJSON2 = Новый ЗаписьJSON;
    ЗаписьJSON2.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON2, Товары);
    Результат2 = ЗаписьJSON2.Закрыть();
    
    Сообщить("JSON из массива структур:");
    Сообщить(Результат2);
    
КонецПроцедуры

Чтение JSON в структуру и соответствие

// Парсинг JSON-строки в структуру и соответствие
Процедура ПрочитатьJSONВСтруктуру()

    JSONСтрока = "
    {
        ""наименование"": ""Ноутбук"",
        ""цена"": 50000,
        ""характеристики"": {
            ""процессор"": ""Intel i7"",
            ""память"": 16
        },
        ""наличие"": true
    }";
    
    // Чтение в структуру
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(JSONСтрока);
    Данные = ПрочитатьJSON(ЧтениеJSON, Истина);
    ЧтениеJSON.Закрыть();
    
    Сообщить("Прочитанные данные (структура):");
    Сообщить("Наименование: " + Данные.наименование);
    Сообщить("Цена: " + Данные.цена);
    Сообщить("Процессор: " + Данные.характеристики.процессор);
    Сообщить("Наличие: " + Данные.наличие);
    
    // Чтение в соответствие (сохраняется порядок)
    ЧтениеJSON2 = Новый ЧтениеJSON;
    ЧтениеJSON2.УстановитьСтроку(JSONСтрока);
    ДанныеСоответствие = ПрочитатьJSON(ЧтениеJSON2, Ложь);
    ЧтениеJSON2.Закрыть();
    
    Сообщить("Прочитанные данные (соответствие):");
    Для Каждого КлючЗначение Из ДанныеСоответствие Цикл
        Сообщить(КлючЗначение.Ключ + ": " + КлючЗначение.Значение);
    КонецЦикла;
    
КонецПроцедуры

Чтение JSON-массива

// Парсинг JSON-массива в массив 1С
Процедура ПрочитатьJSONМассив()

    JSONСтрока = "
    [
        {
            ""товар"": ""Ноутбук"",
            ""количество"": 5
        },
        {
            ""товар"": ""Монитор"",
            ""количество"": 3
        },
        {
            ""товар"": ""Клавиатура"",
            ""количество"": 10
        }
    ]";
    
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(JSONСтрока);
    Данные = ПрочитатьJSON(ЧтениеJSON);
    ЧтениеJSON.Закрыть();
    
    Сообщить("Прочитано элементов: " + Данные.Количество());
    
    Для Инд = 0 По Данные.Количество() - 1 Цикл
        Элемент = Данные[Инд];
        Сообщить(Строка(Инд+1) + ". " + Элемент.товар + " - " + Элемент.количество + " шт.");
    КонецЦикла;
    
КонецПроцедуры

Сохранение и загрузка JSON в файл

// Запись JSON в файл и чтение JSON из файла
Процедура СохранитьИЗагрузитьJSONФайл()

    ИмяФайла = "C:\Temp\data.json";
    
    // Подготавливаем данные
    Данные = Новый Структура;
    Данные.Вставить("дата", Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd HH:MM:SS"));
    Данные.Вставить("пользователь", Пользователи.ТекущийПользователь().Имя);
    
    Товары = Новый Массив;
    Для Инд = 1 По 3 Цикл
        Товар = Новый Структура;
        Товар.Вставить("код", Инд);
        Товар.Вставить("наименование", "Товар " + Инд);
        Товар.Вставить("цена", Инд * 1000);
        Товары.Добавить(Товар);
    КонецЦикла;
    Данные.Вставить("товары", Товары);
    
    // Запись в файл
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, Данные);
    JSONСтрока = ЗаписьJSON.Закрыть();
    
    Запись = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);
    Запись.Записать(JSONСтрока);
    Запись.Закрыть();
    
    Сообщить("JSON сохранен в файл: " + ИмяФайла);
    
    // Чтение из файла
    Чтение = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8);
    ПрочитаннаяСтрока = Чтение.Прочитать();
    Чтение.Закрыть();
    
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(ПрочитаннаяСтрока);
    ВосстановленныеДанные = ПрочитатьJSON(ЧтениеJSON);
    ЧтениеJSON.Закрыть();
    
    Сообщить("Прочитано из файла:");
    Сообщить("Дата: " + ВосстановленныеДанные.дата);
    Сообщить("Пользователь: " + ВосстановленныеДанные.пользователь);
    Сообщить("Количество товаров: " + ВосстановленныеДанные.товары.Количество());
    
    // Удаляем файл
    УдалитьФайлы(ИмяФайла);
    
КонецПроцедуры

Преобразование таблицы значений в JSON

// Экспорт таблицы значений в JSON-формат
Процедура ТаблицаЗначенийВJSON()

    // Создаем таблицу
    Таблица = Новый ТаблицаЗначений;
    Таблица.Колонки.Добавить("Код", Новый ОписаниеТипов("Число"));
    Таблица.Колонки.Добавить("Наименование");
    Таблица.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
    
    Таблица.Добавить().Код = 1; Таблица[0].Наименование = "Ноутбук"; Таблица[0].Цена = 50000;
    Таблица.Добавить().Код = 2; Таблица[1].Наименование = "Монитор"; Таблица[1].Цена = 15000;
    Таблица.Добавить().Код = 3; Таблица[2].Наименование = "Клавиатура"; Таблица[2].Цена = 2000;
    
    // Преобразуем таблицу в массив структур
    МассивДанных = Новый Массив;
    Для Каждого СтрокаТ Из Таблица Цикл
        СтрокаДанных = Новый Структура;
        Для Каждого Колонка Из Таблица.Колонки Цикл
            СтрокаДанных.Вставить(Колонка.Имя, СтрокаТ[Колонка.Имя]);
        КонецЦикла;
        МассивДанных.Добавить(СтрокаДанных);
    КонецЦикла;
    
    // Записываем в JSON
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, МассивДанных);
    Результат = ЗаписьJSON.Закрыть();
    
    Сообщить("Таблица значений в формате JSON:");
    Сообщить(Результат);
    
    // Обратно: из JSON в таблицу значений
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(Результат);
    ПрочитанныйМассив = ПрочитатьJSON(ЧтениеJSON);
    ЧтениеJSON.Закрыть();
    
    НоваяТаблица = Новый ТаблицаЗначений;
    Если ПрочитанныйМассив.Количество() > 0 Тогда
        // Добавляем колонки
        Для Каждого Ключ Из ПрочитанныйМассив[0].Ключи() Цикл
            НоваяТаблица.Колонки.Добавить(Ключ);
        КонецЦикла;
        
        // Добавляем строки
        Для Каждого Элемент Из ПрочитанныйМассив Цикл
            СтрокаНовой = НоваяТаблица.Добавить();
            Для Каждого Ключ Из Элемент.Ключи() Цикл
                СтрокаНовой[Ключ] = Элемент[Ключ];
            КонецЦикла;
        КонецЦикла;
    КонецЕсли;
    
    Сообщить("Восстановленная таблица:");
    Для Каждого СтрокаТ Из НоваяТаблица Цикл
        Сообщить(СтрокаТ.Код + " | " + СтрокаТ.Наименование + " | " + СтрокаТ.Цена);
    КонецЦикла;
    
КонецПроцедуры

Работа с вложенными JSON-структурами

// Обработка сложных вложенных JSON-данных
Процедура ВложенныеJSONСтруктуры()

    // Создаем сложную структуру
    Данные = Новый Структура;
    Данные.Вставить("компания", "ООО Ромашка");
    
    Контакты = Новый Структура;
    Контакты.Вставить("телефон", "8-800-123-45-67");
    Контакты.Вставить("email", "info@romashka.ru");
    Контакты.Вставить("адрес", Новый Структура("город, улица, дом", "Москва", "Тверская", 10));
    Данные.Вставить("контакты", Контакты);
    
    Сотрудники = Новый Массив;
    Для Инд = 1 По 3 Цикл
        Сотрудник = Новый Структура;
        Сотрудник.Вставить("табельный", Инд);
        Сотрудник.Вставить("фио", "Сотрудник " + Инд);
        Сотрудник.Вставить("отдел", "Отдел " + Строка(Инд % 2 + 1));
        
        Навыки = Новый Массив;
        Навыки.Добавить("Навык " + Строка(Инд * 1));
        Навыки.Добавить("Навык " + Строка(Инд * 2));
        Сотрудник.Вставить("навыки", Навыки);
        
        Сотрудники.Добавить(Сотрудник);
    КонецЦикла;
    Данные.Вставить("сотрудники", Сотрудники);
    
    // Сериализуем в JSON
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, Данные);
    JSONСтрока = ЗаписьJSON.Закрыть();
    
    Сообщить("Сложный JSON:");
    Сообщить(JSONСтрока);
    
    // Десериализуем обратно
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(JSONСтрока);
    Восстановленные = ПрочитатьJSON(ЧтениеJSON);
    ЧтениеJSON.Закрыть();
    
    Сообщить("Восстановленные данные:");
    Сообщить("Компания: " + Восстановленные.компания);
    Сообщить("Телефон: " + Восстановленные.контакты.телефон);
    Сообщить("Адрес: " + Восстановленные.контакты.адрес.город + 
             ", " + Восстановленные.контакты.адрес.улица + 
             ", " + Восстановленные.контакты.адрес.дом);
    
    Сообщить("Сотрудники:");
    Для Каждого Сотр Из Восстановленные.сотрудники Цикл
        Сообщить("  " + Сотр.фио + " (" + Сотр.отдел + ")");
        Сообщить("    Навыки: " + СтрСоединить(Сотр.навыки, ", "));
    КонецЦикла;
    
КонецПроцедуры

Форматированный вывод JSON (pretty print)

// Генерация читаемого JSON с отступами
Процедура ФорматированныйJSON()

    Данные = Новый Структура;
    Данные.Вставить("успех", Истина);
    Данные.Вставить("сообщение", "Данные загружены");
    
    Данные.Вставить("результаты", Новый Массив);
    Для Инд = 1 По 2 Цикл
        Результат = Новый Структура;
        Результат.Вставить("ид", Инд);
        Результат.Вставить("название", "Элемент " + Инд);
        Данные.результаты.Добавить(Результат);
    КонецЦикла;
    
    // Форматированный вывод с отступами
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписьJSON.ЗаписатьНачалоОбъекта();
    
    // Параметр Ложь означает не использовать форматирование по умолчанию
    // Мы управляем форматированием вручную
    ЗаписьJSON.ЗаписатьИмяСвойства("успех");
    ЗаписьJSON.ЗаписатьЗначение(Данные.успех);
    
    ЗаписьJSON.ЗаписатьИмяСвойства("сообщение");
    ЗаписьJSON.ЗаписатьЗначение(Данные.сообщение);
    
    ЗаписьJSON.ЗаписатьИмяСвойства("результаты");
    ЗаписьJSON.ЗаписатьНачалоМассива();
    Для Каждого Рез Из Данные.результаты Цикл
        ЗаписьJSON.ЗаписатьНачалоОбъекта();
        ЗаписьJSON.ЗаписатьИмяСвойства("ид");
        ЗаписьJSON.ЗаписатьЗначение(Рез.ид);
        ЗаписьJSON.ЗаписатьИмяСвойства("название");
        ЗаписьJSON.ЗаписатьЗначение(Рез.название);
        ЗаписьJSON.ЗаписатьКонецОбъекта();
    КонецЦикла;
    ЗаписьJSON.ЗаписатьКонецМассива();
    
    ЗаписьJSON.ЗаписатьКонецОбъекта();
    Результат = ЗаписьJSON.Закрыть();
    
    Сообщить("Форматированный JSON:");
    Сообщить(Результат);
    
    // Альтернативный способ через ПараметрыЗаписиJSON
    Параметры = Новый ПараметрыЗаписиJSON;
    Параметры.Отступ = 4; // 4 пробела
  
    ЗаписьJSON2 = Новый ЗаписьJSON;
    ЗаписьJSON2.УстановитьСтроку(Параметры);
    ЗаписатьJSON(ЗаписьJSON2, Данные);
    Результат2 = ЗаписьJSON2.Закрыть();
    
    Сообщить("Форматированный JSON (через ПараметрыЗаписиJSON):");
    Сообщить(Результат2);
    
КонецПроцедуры

Обработка ошибок при парсинге JSON

// Безопасный парсинг JSON с обработкой ошибок
Процедура БезопасныйПарсингJSON()

    // Корректный JSON
    КорректныйJSON = "{\"имя\": \"Иван\", \"возраст\": 30}";
    
    // Некорректные JSON (для теста)
    НекорректныйJSON1 = "{\"имя\": \"Иван\", \"возраст\": 30"; // отсутствует закрывающая скобка
    НекорректныйJSON2 = "{\"имя\": \"Иван\", возраст: 30}"; // значение без кавычек
    
    Функция БезопасноПрочитатьJSON(JSONСтрока)
        ЧтениеJSON = Новый ЧтениеJSON;
        СтруктураОшибки = Новый Структура;
        СтруктураОшибки.Вставить("успех", Ложь);
        СтруктураОшибки.Вставить("данные", Неопределено);
        СтруктураОшибки.Вставить("ошибка", "");
        
        Попытка
            ЧтениеJSON.УстановитьСтроку(JSONСтрока);
            Данные = ПрочитатьJSON(ЧтениеJSON);
            ЧтениеJSON.Закрыть();
            
            СтруктураОшибки.успех = Истина;
            СтруктураОшибки.данные = Данные;
            Возврат СтруктураОшибки;
        Исключение
            СтруктураОшибки.ошибка = ОписаниеОшибки();
            Возврат СтруктураОшибки;
        КонецПопытки;
    КонецФункции
    
    // Тестируем корректный JSON
    Результат = БезопасноПрочитатьJSON(КорректныйJSON);
    Если Результат.успех Тогда
        Сообщить("Корректный JSON прочитан успешно:");
        Сообщить("Имя: " + Результат.данные.имя);
        Сообщить("Возраст: " + Результат.данные.возраст);
    Иначе
        Сообщить("Ошибка: " + Результат.ошибка);
    КонецЕсли;
    
    // Тестируем некорректный JSON
    Результат2 = БезопасноПрочитатьJSON(НекорректныйJSON1);
    Если Результат2.успех Тогда
        Сообщить("JSON прочитан успешно");
    Иначе
        Сообщить("Некорректный JSON:");
        Сообщить("Ошибка: " + Результат2.ошибка);
    КонецЕсли;
    
    // Валидация JSON перед парсингом (упрощенная)
    Функция ВалидныйJSON(JSONСтрока)
        Попытка
            ЧтениеJSON = Новый ЧтениеJSON;
            ЧтениеJSON.УстановитьСтроку(JSONСтрока);
            ПрочитатьJSON(ЧтениеJSON);
            ЧтениеJSON.Закрыть();
            Возврат Истина;
        Исключение
            Возврат Ложь;
        КонецПопытки;
    КонецФункции
    
    Сообщить("Проверка валидности корректного JSON: " + ВалидныйJSON(КорректныйJSON));
    Сообщить("Проверка валидности некорректного JSON: " + ВалидныйJSON(НекорректныйJSON1));
    
КонецПроцедуры

Обмен данными с внешним API через JSON

// Формирование и разбор JSON для HTTP-запросов к API
Процедура JSONДляAPIOбмена()

    // Формирование тела запроса
    ЗапросКAPI = Новый Структура;
    ЗапросКAPI.Вставить("метод", "getProducts");
    ЗапросКAPI.Вставить("параметры", Новый Структура("категория, лимит", "электроника", 10));
    ЗапросКAPI.Вставить("версия", "1.0");
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, ЗапросКAPI);
    ТелоJSON = ЗаписьJSON.Закрыть();
    
    Сообщить("Тело запроса к API:");
    Сообщить(ТелоJSON);
    
    // Эмуляция ответа от API
    ОтветJSON = "
    {
        ""статус"": ""успех"",
        ""данные"": {
            ""товары"": [
                {""ид"": 1, ""название"": ""Ноутбук"", ""цена"": 50000},
                {""ид"": 2, ""название"": ""Монитор"", ""цена"": 15000}
            ],
            ""всего"": 2
        }
    }";
    
    // Разбор ответа
    Функция РазобратьОтветAPI(JSONОтвет)
        ЧтениеJSON = Новый ЧтениеJSON;
        ЧтениеJSON.УстановитьСтроку(JSONОтвет);
        Ответ = ПрочитатьJSON(ЧтениеJSON);
        ЧтениеJSON.Закрыть();
        
        Результат = Новый Структура;
        Результат.Вставить("успех", Ответ.статус = "успех");
        
        Если Результат.успех Тогда
            Товары = Новый Массив;
            Для Каждого Товар Из Ответ.данные.товары Цикл
                ТоварСтруктура = Новый Структура;
                ТоварСтруктура.Вставить("ид", Товар.ид);
                ТоварСтруктура.Вставить("наименование", Товар.название);
                ТоварСтруктура.Вставить("цена", Товар.цена);
                Товары.Добавить(ТоварСтруктура);
            КонецЦикла;
            Результат.Вставить("товары", Товары);
            Результат.Вставить("всего", Ответ.данные.всего);
        КонецЕсли;
        
        Возврат Результат;
    КонецФункции
    
    РезультатAPI = РазобратьОтветAPI(ОтветJSON);
    
    Сообщить("Результат обработки ответа API:");
    Если РезультатAPI.успех Тогда
        Сообщить("Получено товаров: " + РезультатAPI.всего);
        Для Каждого Товар Из РезультатAPI.товары Цикл
            Сообщить(Строка(Товар.ид) + ". " + Товар.наименование + " - " + Товар.цена);
        КонецЦикла;
    Иначе
        Сообщить("Ошибка при получении данных");
    КонецЕсли;
    
КонецПроцедуры

Примечания

// Важные особенности работы с форматом JSON в 1С:
// 1. Для работы с JSON используются объекты ЗаписьJSON, ЧтениеJSON и функции ЗаписатьJSON, ПрочитатьJSON
// 2. ЗаписатьJSON может принимать структуру, соответствие, массив, список значений и другие коллекции
// 3. ПрочитатьJSON с параметром Истина возвращает структуру, с Ложь - соответствие (сохраняет порядок ключей)
// 4. При чтении JSON автоматически преобразует null в Неопределено, true/false в Истина/Ложь
// 5. Для форматированного вывода используйте ПараметрыЗаписиJSON с отступом
// 6. Кодировка JSON по умолчанию - UTF-8, при сохранении в файл указывайте кодировку явно
// 7. При парсинге большого JSON используйте построчное чтение через ЧтениеJSON
// 8. JSON-массивы превращаются в обычные массивы 1С
// 9. JSON-объекты (словари) превращаются в структуру или соответствие
// 10. Для обмена с внешними API всегда проверяйте статус ответа и обрабатывайте ошибки
// 11. При сериализации таблицы значений предварительно преобразуйте её в массив структур
// 12. Избегайте циклических ссылок в данных - они вызовут ошибку при сериализации

Поделиться с друзьями
Smirnov code
Добавить комментарий