JSON в 1С

13.06.19

Разработка - Универсальные функции

Функция для преобразования в JSON.
Функция JSON(Значение) Экспорт

    Разделитель="";
   
    ТипЗн=ТипЗнч(Значение);

    Если ТипЗн=Тип("Строка") Тогда
        Стр=""""+Маскировать(Значение)+""""

    ИначеЕсли ТипЗн=Тип("Число") ИЛИ ТипЗнч(Значение)=Тип("Булево") Тогда
        Стр=XMLСтрока(Значение)

    ИначеЕсли ТипЗн=Тип("Дата") Тогда
        Стр=""""+?(ЗначениеЗаполнено(Значение),XMLСтрока(Значение),"")+""""

    ИначеЕсли ТипЗн=Тип("Структура") Тогда
        Стр="{";
        Для Каждого Параметр Из Значение Цикл
            Стр=Стр+Разделитель+Символы.ПС+""""+Параметр.Ключ+""":"+JSON(Параметр.Значение);
            Разделитель=","
        КонецЦикла;
        Стр=Стр+Символы.ПС+"}";

    ИначеЕсли ТипЗн=Тип("Массив") Тогда
        Стр="[";
        Для Каждого Элемент Из Значение Цикл
            Стр=Стр+Разделитель+Символы.ПС+JSON(Элемент);
            Разделитель=","
        КонецЦикла;
        Стр=Стр+Символы.ПС+"]";

    ИначеЕсли ТипЗн=Тип("ТаблицаЗначений") Тогда
        Колонки=Значение.Колонки;
        Массив=Новый Массив;
        Для Каждого СтрокаТЗ Из Значение Цикл
            Структура=Новый Структура;
            Для Каждого Колонка Из Колонки Цикл
                Структура.Вставить(Колонка.Имя,СтрокаТЗ[Колонка.Имя])
            КонецЦикла;
            Массив.Добавить(Структура);
        КонецЦикла;
        Стр=JSON(Массив)

    ИначеЕсли Значение=Неопределено Тогда
        Стр="null"

    Иначе
        Стр=""""+Маскировать(Значение)+""""
    КонецЕсли;

    Возврат Стр
КонецФункции

Функция ФорматированныйJSON(Значение,Отступ="") Экспорт
    Разделитель="";
   
    ТипЗн=ТипЗнч(Значение);

    Если ТипЗн=Тип("Строка") Тогда
        Стр=""""+Маскировать(Значение)+""""

    ИначеЕсли ТипЗн=Тип("Число") ИЛИ ТипЗнч(Значение)=Тип("Булево") Тогда
        Стр=XMLСтрока(Значение)

    ИначеЕсли ТипЗн=Тип("Дата") Тогда
        Стр=""""+?(ЗначениеЗаполнено(Значение),XMLСтрока(Значение),"")+""""

    ИначеЕсли ТипЗн=Тип("Структура") Тогда
        Стр="{";
        Для Каждого Параметр Из Значение Цикл
            Стр=Стр+Разделитель+Символы.ПС+Отступ+""""+Параметр.Ключ+""":"+ФорматированныйJSON(Параметр.Значение,Отступ+Символы.Таб);
            Разделитель=","
        КонецЦикла;
        Стр=Стр+Символы.ПС+Отступ+"}";

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

    ИначеЕсли ТипЗн=Тип("ТаблицаЗначений") Тогда
        Колонки=Значение.Колонки;
        Массив=Новый Массив;
        Для Каждого СтрокаТЗ Из Значение Цикл
            Структура=Новый Структура;
            Для Каждого Колонка Из Колонки Цикл
                Структура.Вставить(Колонка.Имя,СтрокаТЗ[Колонка.Имя])
            КонецЦикла;
            Массив.Добавить(Структура);
        КонецЦикла;
        Стр=ФорматированныйJSON(Массив)

    ИначеЕсли Значение=Неопределено Тогда
        Стр="null"

    Иначе
        Стр=""""+Маскировать(Значение)+""""
    КонецЕсли;

    Возврат Стр
КонецФункции

Функция Маскировать(Знач Стр)
    Стр=СтрЗаменить(Стр,Символы.ПС,"\n");
    Стр=СтрЗаменить(Стр,Символы.ВК,"\r");
    Стр=СтрЗаменить(Стр,"""","\""");
    Стр=СтрЗаменить(Стр,"'","\'");
    Возврат Стр
КонецФункции

Примеры вызовов функции JSON:

Структура=Новый Структура("sIP,sDefaultGateway,nNode,nRing");

ЗаполнитьЗначенияСвойств(Структура,Источник);
Структура.Вставить("Error",Новый Структура("Code,Description",0,"OK"));
Возврат JSON(Структура)

или так

Запрос=Новый Запрос("ВЫБРАТЬ * ИЗ Справочник.Абоненты");
Возврат JSON(Запрос.Выполнить().Выгрузить());

Просьба не пинать, так как это моя первая публикация.

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    5529    DeerCven    15    

57

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    46692    dimanich70    83    

165

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    6895    6    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    57918    atdonya    31    

68

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    8673    ke.92@mail.ru    17    

68

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    22899    YA_418728146    8    

174
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Душелов 4024 26.10.09 13:59 Сейчас в теме
А почему ссылочные типы не сериализовать?
3. BigB 193 26.10.09 14:14 Сейчас в теме
(1) да как то не было надобности, но впринцепе можно сделать
2. Трактор 1274 26.10.09 14:06 Сейчас в теме
Прикольно. И главное жизненно. Можно AJAJ делать без обточки в ПХП.
4. PRoman 73 27.10.09 10:37 Сейчас в теме
а как обратно преобразовать?
5. BigB 193 28.10.09 10:19 Сейчас в теме
6. BigB 193 17.11.09 15:58 Сейчас в теме
7. xzorkiix 35 18.10.13 13:05 Сейчас в теме
Спасибо, сберегло время на разборы.
8. TitanLuchs 605 11.04.14 16:44 Сейчас в теме
Спасибо автору, сберег время
9. Elisy 957 28.11.14 08:01 Сейчас в теме
По скорости, если кому-то интересно. Сериализация Json работает очень медленно по сравнению с XML-сериализацией.
Оптимизация делалась для веб-сайта http://www.oboi.kg
На данных из примерно 5 тысяч записей таблицы значений перевод в XML уменьшил время обработки со 120 секунд (2 минуты) до 4 секунд.
Трактор; +1 Ответить
Для отправки сообщения требуется регистрация/авторизация