1C:JSON парсер и сериализатор

JSON парсер и сериализатор c полной поддержкой стандарта, широким набором сериализуемых типов и продвинутым синтаксический анализатором для платформы 1С:Предприятие 8.

Особенности

Парсер и сериализатор поддерживают два режима (формата) работы:
  • Стандартный – полная поддержка стандарта JSON;
  • Альтернативный – направлен на применение в проектах подразумевающих постоянный двусторонний обмен данными и требующих повышенную скорость парсинга, минимизацию пересылаемых пакетов и однозначную идентификацию ссылочных типов во входящих данных.
Независимо от режима работы сериализатор, по требованию, позволяет автоматически передавать не только уникальный идентификатор ссылки, но и ее представление, а парсер в свою очередь, анализируя входные данные, опускает представления ссылок, не включая их в результирующий набор данных.

При необходимости, сериализатор может маскировать кириллические символы современных алфавитов славянских языков “АБВГҐДЂЃЕЀЁЄЖЗЅИЍІЇЙЈКЛЉМНЊОПРСТЋЌУЎФХЦЧЏШЩЪЫЬЭЮЯ”.
Поддерживаются все среды исполнения с ограничением сериализуемых типов. Используется кроссплатформенный код.

Альтернативный режим

  • Не поддерживается форматирование, как во входящих, так и в исходящих данных;
  • Сериализация ссылочных типов в строковое служебное представление.

Приятности

Парсер
  • Устойчивость к некорректным данным и не подверженность injection атакам;
  • Продвинутый синтаксический анализатор (указывает место и тип ошибки в данных);
  • Поддержка форматирования во входящих данных (только стандартный режим);
  • Безопасный разбор форматирования - незамаскированные символы форматирования в строковых значениях не будут утеряны;
  • Поддержка строк в одинарных и в двойных кавычках;
  • Автоматическое приведение объекта к структуре или соответствию в зависимости от имен свойств;
  • Автоматическое преобразование к типу Дата строки вида “9999-99-99T99:99:99Z”;
  • Автоматическое преобразование к типу УникальныйИдентификатор строки вида “xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”;
  • Автоматического определение режима (стандартного или альтернативного) входящих данных;
  • Автоматического определение необходимости отсечения представления ссылок;
  • Однозначная идентификация ссылок (только альтернативный режим).
Сериализатор
  • Поддержка форматирования исходящих данных (только стандартный режим);
  • Широкий состав сериализуемых типов данных, в том числе ссылок;
  • Автоматическое приведение значений ключей соответствий к строковому представлению 1C;
  • Автоматическое преобразование неподдерживаемых типов к строке;
  • Нечувствительность к локализации.

Неприятности

  • Нестандартно форматированный код на гране читаемости;
  • Сериализатор ориентирован на средние-крупные пакеты данных.

Сериализуемые типы

  • Неопределено;
  • Null;
  • Примитивные типы (все);
  • Универсальные коллекции значений (все);
  • УникальныйИдентификатор;
  • ЛюбаяСсылка;
  • Запрос;
  • РезультатЗапроса;
  • ВыборкаИзРезультатаЗапроса;
  • ПостроительЗапроса;
  • ПостроительОтчета;
  • ДанныеФормыКоллекция (только 8.2);
  • ДанныеФормыСтруктураСКоллекцией (только 8.2);
  • ДанныеФормыДерево (только 8.2);
  • ДвоичныеДанные;
  • Картинка;
  • ХранилищеЗначения.

Порядок сериализации типов

  • Неопределено – сериализуется как Null;
  • Null – согласно стандарту;
  • Примитивные типы – согласно стандарту;
  • Массивы – массив, согласно стандарту: [ Значение, ... ]
  • Структуры и соответствия – объект, согласно стандарту; { Ключ:Значение, ... }
  • СписокЗначений – массив объектов с тремя свойствами “Значение”, “Представление” и “Пометка”; [ { "Значение":Значение, "Представление":Представление, "Пометка":Пометка }, ... ]
  • КлючИЗначение – объект с двумя свойствами “Ключ” и “Значение”; { "Ключ":Ключ, "Значение":Значение }
  • ТаблицаЗначений – массив объектов: [ { Колонка:Значение, ... }, ... ]
  • ДеревоЗначений – массив объектов с обязательным свойством “Строки”: [ { Колонка:Значение, ... , "Строки":[ { Колонка:Значение, ... , "Строки":[ ... ] } , ... ] }, ... ]
  • УникальныйИдентификатор – приведение к строке вида “xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”;
  • ЛюбаяСсылка:
    • – Стандартный режим – получение уникального идентификатора ссылки и его сериализация;
    • – Альтернативный режим – приведение к строке служебного вида “¦ref¦ ... ¦”.
    При сериализации ссылок в режиме автоматически передачи не только сериализованного значения ссылки, но и ее представления. Каждая ссылка передается как объект с двумя свойствами “Ссылка” и “Представление”. { "Ссылка":Ссылка, "Представление":Представление }
  • Запрос – автоматически выполняется и сериализуется как таблица значений;
  • РезультатЗапроса – сериализуется как таблица значений;
  • ВыборкаИзРезультатаЗапроса – сериализуется как структура значений текущей запись результата запроса;
  • ПостроительЗапроса – автоматически выполняется и сериализуется как таблица значений;
  • ПостроительОтчета – автоматически выполняется и сериализуется как таблица значений;
  • ДанныеФормыКоллекция – сериализуется как таблица значений;
  • ДанныеФормыСтруктураСКоллекцией – сериализуется как таблица значений;
  • ДанныеФормыДерево – сериализуется как дерево значений;
  • ДвоичныеДанные – кодируется по алгоритму base64 и сериализуется как строка;
  • Картинка – автоматически преобразуется и сериализуется как двоичные данные;
  • ХранилищеЗначения – автоматически извлекается сохраненное значение и сериализуется в зависимости от типа извлеченного значения.

Рекомендация

При работе с проектами, в исходящих строковых данных которых не гарантируется отсутствие символов из диапазонов:
  • [0x007f, 0x009f], 0x00ad, [0x0600, 0x0604], 0x070f, [0x17b4, 0x17b5], [0x200c, 0x200f], [0x2028, 0x202f], [0x2060, 0x206f], 0xfeff, [0xfff0, 0xffff]
рекомендуется не отключать настройку полного маскирования символов.

Производительность

Производительность парсера исключительно зависит от набора входящих данных, а также от наличия форматирования. Наихудшим вариантом является форматированный массив чисел, наилучшим – неформатированный массив строк.
Intel Core 2 Duo T5870 @ 2GHz – форматированный массив со всеми приблизительно равномерно встречающимися типами данных:
  • Парсер: 35 Кбайт/с.
  • Сериализатор: 165 Кбайт/с.

История изменений

  • Версия 2.0.0.18:
    • – (Изменение) При сериализации строк специальный символ бекслеш ( \ ) более не маскируется;
    • – (Оптимизация) Устранена существенная деградация производительности при парсинге JSON большого размера;
    • – (Исправление) Исправлены опечатки.
  • Версия 2.0.0.17:
    • – (Новое) Маскирование кириллических символов современных алфавитов славянских языков (по требованию);
    • – (Новое) Поддержка сериализатором типов: ДвоичныеДанные, Картинка, ХранилищеЗначения;
    • – (Изменение) Рефакторинг переменных и процедур;
    • – (Исправление) Сериализация типа COMSafeArray;
    • – (Исправление) Удалены лишние ключевые слова "Экспорт".
    • – (Оптимизация) Уменьшение проверок связанных с режимом и параметрами парсинга и сериализцаии;
    • – (Оптимизация) Проверка необходимости анализа форматирования вынесена из процедуры анализа форматирования;
    • – (Оптимизация) Изменен алгоритм автоматического приведение объекта к структуре или соответствию в зависимости от имен свойств;
    • – (Оптимизация) Отказ от явного приведения типов в пользу неявного в операторах условий;
    • – (Оптимизация) Отказ от оператора "Попытка Исключение" при преобразовании строки к уникальному идентификатору;
    • – (Оптимизация) Изменен порядок проверки типов при парсинге.
  • Версия 2.0.0.15:
    • – Релиз.

24 comments:

  1. Спасибо, очень пригодилось.

    ReplyDelete
  2. Тоже спасибо, спасло.

    ReplyDelete
  3. Спасибо огромное, очень помогло

    ReplyDelete
  4. Отличная работа

    ReplyDelete
  5. Огромное спасибо!

    ReplyDelete
  6. Спасибо. Очень помогло в разборе ответа от Сбербанка.

    ReplyDelete
  7. Спасибо, Отличная работа!

    ReplyDelete
  8. Спасибо, помогла обработка!

    ReplyDelete
  9. Если это твой код, я несмотря на то что парень хочу от тебя детей =))) Комментарии, описания, понятность кода. Это как увидеть комету Галлея в 1С.

    ReplyDelete
  10. Да, здорово, спасибо большое!

    ReplyDelete
  11. В 3.6 теперь есть парсер.
    Спасибо до этого этот парсер нес службу в нескольких конфах, но все когда заканчивается.

    ReplyDelete
  12. При открытии обработки пишет ошибку:
    Ошибка инициализации модуля: ВнешняяОбработка.JSON.МодульОбъекта
    по причине:
    {ВнешняяОбработка.JSON.МодульОбъекта(257,9)}: Процедура или функция с указанным именем уже определена (ПрочитатьJSON)
    Функция <>ПрочитатьJSON(Значение, Стандарт = Истина, ПредставленияСсылок = Ложь) Экспорт
    {ВнешняяОбработка.JSON.МодульОбъекта(279,9)}: Процедура или функция с указанным именем уже определена (ЗаписатьJSON)
    Функция <>ЗаписатьJSON(Значение, Стандарт = Истина, ПредставленияСсылок = Ложь) Экспорт
    В чем причина?

    ReplyDelete
    Replies
    1. аналогичная проблема

      Delete
    2. Проблема в том, что в версии 8.3.6.1977 появились глобальные функции "ПрочитатьJSON" и "ЗаписатьJSON", поэтому в этой обрабокте они должны называться по-другому.
      Откройте обработку в конфигураторе и замените "ПрочитатьJSON", например, на "мПрочитатьJSON" и "ЗаписатьJSON" на "мЗаписатьJSON".

      Delete
    3. Александр, спасибо!
      Мозг сломал но не допер сам до того, хотя крутился вокруг этого момента.

      Delete
  13. This comment has been removed by the author.

    ReplyDelete
  14. Проблема в том, что в версии 8.3.6.1977 появились глобальные функции "ПрочитатьJSON" и "ЗаписатьJSON", поэтому в этой обрабокте они должны называться по-другому.
    Откройте обработку в конфигураторе и замените "ПрочитатьJSON", например, на "мПрочитатьJSON" и "ЗаписатьJSON" на "мЗаписатьJSON".
    После исправления появилась ошибка ОбработкаJSON.Модуль(561):JSON Неверный формат данных в позиции 1

    ReplyDelete
  15. This comment has been removed by the author.

    ReplyDelete
  16. Прекрасное, аккуратно сработанное решение! Спасибо огромное, Александр!!!

    ReplyDelete
  17. Благодарю, добрый человек!!!

    ReplyDelete

Note: Only a member of this blog may post a comment.