legionwfz / 1C-JSON

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

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

1С:JSON

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

Версия: 2.0.0.18

Особенности

Парсер и сериализатор поддерживают два режима (формата) работы:

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

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

Поддерживаются все среды исполнения с ограничением сериализуемых типов. Используется кроссплатформенный код.

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

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

Приятности

Парсер

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

Сериализатор

  • Поддержка форматирования исходящих данных (только стандартный режим);
  • Широкий состав сериализуемых типов данных, в том числе ссылок;
  • Автоматическое приведение значений ключей соответствий к строковому представлению в формате 1С [3];
  • Автоматическое преобразование неподдерживаемых типов к строке;
  • Нечувствительность к локализации [4].

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

  • Нестандартно форматированный код (Alt+Shift+F в помощь) на гране читаемости;
  • Сериализатор ориентирован, на средние-крупные пакеты данных.

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

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

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

  • Неопределено – сериализуется как Null;

  • Null – согласно стандарту;

  • Примитивные типы – согласно стандарту;

  • Массивы – массив, согласно стандарту:

    [ Значение, ... ]
    
  • Структуры и соответствия – объект, согласно стандарту:

    { Ключ:Значение, ... }
    
  • СписокЗначений – массив объектов с тремя свойствами "Значение", "Представление" и "Пометка":

    [ { "Значение":Значение, "Представление":Представление, "Пометка":Пометка }, ... ]
    
  • КлючИЗначение – объект с двумя свойствами "Ключ" и "Значение":

    { "Ключ":Ключ, "Значение":Значение }
    
  • ТаблицаЗначений – массив объектов:

    [ { Колонка:Значение, ... }, ... ]
    
  • ДеревоЗначений – массив объектов с обязательным свойством "Строки":

    [ { Колонка:Значение, ... , "Строки":[ { Колонка:Значение, ... , "Строки":[ ... ] } , ... ] }, ... ]
    
  • УникальныйИдентификатор – приведение к строке вида "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";

  • ЛюбаяСсылка:

    • Стандартный режим – получение уникального идентификатора ссылки (в том числе и для перечислений) и его сериализация;

    • Альтернативный режим – приведение к строке служебного вида "¦ref¦ ... ¦".

      При сериализации ссылок в режиме автоматически передачи не только сериализованного значения ссылки, но и ее представления. Каждая ссылка передается как объект с двумя свойствами "Ссылка" и "Представление":

      { "Ссылка":Ссылка, "Представление":Представление }
      
  • Запрос – автоматически выполняется и сериализуется как таблица значений;
  • РезультатЗапроса – сериализуется как таблица значений;
  • ВыборкаИзРезультатаЗапроса – сериализуется как структура значений текущей запись результата запроса;
  • ПостроительЗапроса – автоматически выполняется и сериализуется как таблица значений;
  • ПостроительОтчета – автоматически выполняется и сериализуется как таблица значений;
  • ДанныеФормыКоллекция – сериализуется как таблица значений;
  • ДанныеФормыСтруктураСКоллекцией – сериализуется как таблица значений;
  • ДанныеФормыДерево – сериализуется как дерево значений;
  • ДвоичныеДанные – кодируется по алгоритму base64 [5] и сериализуется как строка;
  • Картинка – автоматически преобразуется и сериализуется как двоичные данные;
  • ХранилищеЗначения – автоматически извлекается сохраненное значение и сериализуется в зависимости от типа извлеченного значения.

Как использовать

Методы

  • ПрочитатьJSON – парсер;
  • ЗаписатьJSON – сериализатор.

Настройки и параметры

Параметры функций

Стандарт – определяет режим работы парсера и сериализатора:

  • Истина – стандартный режим (значение по умолчанию);
  • Ложь – альтернативный режим;
  • Неопределено – автоматическое определение режима входящих данных (только парсер, не рекомендуется – влияет на производительность).

ПредставленияСсылок – позволяет автоматически передавать не только значение ссылки, но и ее представление:

  • Истина – ссылка парсится и сериализуется как объект с двумя свойствами "Ссылка" и "Представление";
  • Ложь – ссылка парсится и сериализуется как уникальный идентификатор ссылки (значение по умолчанию);
  • Неопределено – автоматическое определение формата ссылок во входящих данных (только парсер, не рекомендуется – влияет на производительность).
Настройки

АвтоматическоеПриведениеОбъектаКСтруктуре – автоматическое приведение объекта к структуре, а не к соответствию.

Настройка изменяется в функции АвтоматическоеПриведениеОбъектаКСтруктуре (по умолчанию отключена). Автоматическое приведение к структуре выполняется только для объектов имена свойств, которых могут быть использованы как ключи структуры, все остальные объекты преобразуются в соответствие.

ПолноеМаскированиеСимволов – маскирование символов некорректно обрабатываемых JavaScript-ом.

Настройка изменяется в функции НастройкаПолноеМаскированиеСимволов (по умолчанию включена). Не рекомендуется к использованию, так как влияет на производительность, но гарантирует безопасную передачу данных. Маскирование специальных символов из диапазона [0x0000, 0x001f] выполняется в не зависимости от настройки.

МаскированиеКириллицы – маскирование кириллических символов современных алфавитов славянских языков.

Настройка изменяется в функции НастройкаМаскированиеКириллицы (по умолчанию отключена). Не рекомендуется к использованию, так как влияет на производительность. Маскирование специальных символов из диапазона [0x0000, 0x001f] выполняется в не зависимости от настройки.

НеявноеПриведениеПримитивныхЗначенийКлюча – неявное приведение примитивных значений ключей соответствий к строке.

Настройка изменяется в функции НеявноеПриведениеПримитивныхЗначенийКлюча (по умолчанию отключена).

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

При работе с проектами, в исходящих строковых данных которых не гарантируется отсутствие символов из диапазонов:

[0x007f, 0x009f], 0x00ad, [0x0600, 0x0604], 0x070f, [0x17b4, 0x17b5], [0x200c, 0x200f], [0x2028, 0x202f] [0x2060, 0x206f], 0xfeff, [0xfff0, 0xffff],

рекомендуется не отключать настройку полного маскирования символов (подробнее см. JSON in JavaScript).

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

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

Intel Core 2 Duo T5870 @ 2GHz – форматированный массив со всеми приблизительно равномерно встречающимися типами данных:

Операция Скорость
Парсер 35 Кбайт/с.
Сериализатор 165 Кбайт/с.

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

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

Лицензия

1С:JSON распространяется на условиях лицензии MIT. Пожалуйста, сохраняйте существующие заголовки.

Автор

Александр Переверзев – a.v.pereverzev@gmail.com

Примечания

  1. Не считая нативной реализации появившейся в платформе версии 8.3.6.1977.
  2. Если все имена свойства входящего объекта могут быть использованы как ключи структуры, то такой объект будет автоматически приведен к структуре, а не к соответствию. Управляется настройкой.
  3. Управляется настройкой.
  4. При сериализации некоторых типов, исходящие объекты которых имеют обязательные свойства, такие представления и имена таких свойств всегда имеют русскую локализацию.
  5. Следуя рекомендациям стандарта, сериализатор при кодировании по алгоритму base64, не добавляет переводы строк в результирующие данные (подробнее см. RFC 4648 - Base-N Encodings).

About

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

License:Other