Открыть сервис

ISO/IEC 21778:2017

ISO/IEC 21778:2017 — это международный стандарт, определяющий спецификацию языка программирования JSONiq, предназначенного для обработки и трансформации данных в формате JSON (JavaScript Object Notation). Стандарт был разработан совместно Международной организацией по стандартизации (ISO) и Международной электротехнической комиссией (IEC) в рамках подкомитета SC 32 «Управление и обмен данными» технического комитета ISO/IEC JTC 1 «Информационные технологии».

JSONiq является декларативным языком запросов и преобразований, во многом вдохновлённым языком XQuery (ISO/IEC 13211-2:2000), но ориентированным исключительно на работу с JSON-данными, а не с XML. Стандарт ISO/IEC 21778:2017 устанавливает синтаксис, семантику и встроенные функции языка, а также определяет модель данных, лежащую в основе обработки JSON.

История и предпосылки создания

Разработка JSONiq началась в 2011 году как проект сообщества с открытым исходным кодом, инициированный компанией 28msec (впоследствии переименованной в Zorrosys). Основной целью было создание мощного и выразительного языка для запросов к JSON-данным, аналогичного тому, чем XQuery является для XML. К тому времени JSON стал доминирующим форматом обмена данными в веб-приложениях, API и базах данных NoSQL, однако отсутствовал стандартизированный язык для сложной обработки таких данных, сравнимый по возможностям с SQL для реляционных баз.

В 2013 году проект был передан на рассмотрение в ISO/IEC JTC 1/SC 32, где началась работа по стандартизации. В 2017 году стандарт был официально опубликован под номером ISO/IEC 21778:2017. Он базируется на спецификации JSONiq 1.0, разработанной консорциумом JSONiq, и включает в себя уточнения и дополнения, внесённые в ходе международного обсуждения.

Основные характеристики и возможности

Модель данных

JSONiq оперирует моделью данных, которая является расширением модели JSON. Она включает в себя:

  • Атомарные значения: строки, числа, логические значения (true, false), null.
  • Объекты: неупорядоченные коллекции пар «ключ-значение», где ключи — строки, а значения — любые типы данных модели.
  • Массивы: упорядоченные последовательности значений.
  • Функции: JSONiq поддерживает функции первого класса, которые могут быть переданы как аргументы или возвращены из других функций.
  • Последовательности: фундаментальное понятие языка. В отличие от массивов, последовательности могут содержать элементы разных типов и поддерживают операции конкатенации, фильтрации и проекции.

Синтаксис и конструкции

Синтаксис JSONiq напоминает смесь XQuery и JavaScript. Ключевые конструкции включают:

  • FLWOR-выражения (For, Let, Where, Order by, Return) — основной механизм итерации, фильтрации и трансформации данных. Например:

``jsoniq for $user in db:collection("users") where $user.age > 18 order by $user.name return { "name": $user.name, "email": $user.email } ``

  • Конструкторы объектов и массивов: позволяют создавать новые JSON-структуры на лету.
  • Путевые выражения: для навигации по вложенным JSON-объектам (например, $data.user.address.city).
  • Арифметические, логические и строковые операторы: стандартный набор для вычислений.
  • Условные выражения: if-then-else.
  • Функциональные выражения: определение и вызов пользовательских функций.

Встроенные функции

Стандарт определяет обширную библиотеку встроенных функций, разделённых по категориям:

  • Функции для работы со строками: concat, substring, contains, matches (с поддержкой регулярных выражений).
  • Функции для работы с числами: abs, round, floor, ceiling.
  • Функции для работы с массивами: array:size, array:get, array:append, array:remove, array:flatten.
  • Функции для работы с объектами: object:keys, object:values, object:merge, object:remove.
  • Функции для работы с последовательностями: count, sum, avg, min, max, distinct-values, insert-before, remove.
  • Функции для преобразования типов: jsoniq:parse-json, jsoniq:serialize-json.
  • Функции для доступа к данным: json-doc (загрузка JSON-файла), json-lines (чтение потока JSON-строк).

Применение

Обработка данных в веб-API

JSONiq широко используется для фильтрации, агрегации и трансформации ответов от RESTful API. Например, можно извлечь только необходимые поля из сложного JSON-ответа, объединить данные из нескольких источников или переформатировать структуру.

Анализ данных и ETL

Язык подходит для задач извлечения, преобразования и загрузки (ETL) данных в формате JSON. С его помощью можно выполнять сложные запросы к большим JSON-файлам или потокам данных, не прибегая к программированию на императивных языках.

Базы данных NoSQL

Некоторые документоориентированные базы данных, такие как MarkLogic (организация признана нежелательной в РФ) и Zorrosys, поддерживают JSONiq как встроенный язык запросов. Это позволяет выполнять запросы непосредственно на сервере базы данных, минуя этап извлечения данных на клиент.

Интеграция с XQuery

Благодаря общему происхождению, JSONiq может быть легко интегрирован с XQuery. Существуют реализации, позволяющие обрабатывать как JSON, так и XML в одном запросе, что полезно при работе с гибридными системами.

Реализации

На момент публикации стандарта существовало несколько реализаций JSONiq:

  • 28msec JSONiq — оригинальная реализация от компании-инициатора, предоставляющая облачный сервис для выполнения запросов.
  • Zorrosys — коммерческая СУБД, поддерживающая JSONiq как основной язык запросов.
  • Rumble — реализация с открытым исходным кодом на Java, ориентированная на работу с большими данными (Hadoop, Spark).
  • JSONiq for JavaScript — библиотека, позволяющая выполнять JSONiq-запросы в среде Node.js.

Однако, по состоянию на 2024 год, популярность JSONiq остаётся ограниченной. Основные причины — конкуренция со стороны SQL/JSON (стандарт ISO/IEC 9075-14:2023), встроенного в большинство реляционных СУБД, а также широкое распространение библиотек для обработки JSON на языках общего назначения (Python, JavaScript, Java).

Критика и ограничения

  • Сложность синтаксиса: FLWOR-выражения и путевые выражения могут быть избыточными для простых задач, где достаточно обычного программирования.
  • Низкая производительность: Интерпретаторы JSONiq, как правило, медленнее, чем нативные парсеры JSON в языках программирования.
  • Отсутствие широкой поддержки: Несмотря на статус международного стандарта, JSONiq не получил массового распространения и поддержки в основных СУБД и инструментах.
  • Ограниченная экосистема: Малое количество библиотек, инструментов и учебных материалов по сравнению с SQL или Python.

Связь с другими стандартами

  • ISO/IEC 13211-2:2000 (XQuery) — JSONiq является прямым наследником и адаптацией идей XQuery для JSON.
  • ISO/IEC 9075-14:2023 (SQL/JSON) — альтернативный стандарт для работы с JSON в реляционных базах данных, который получил гораздо более широкое распространение.
  • RFC 8259 (JSON) — базовый формат данных, на котором основан JSONiq.

Источники

  • ISO/IEC 21778:2017 — Information technology — JSONiq query language.
  • JSONiq Specification 1.0 (JSONiq.org).
  • Robie, J., et al. "JSONiq: The Query Language for JSON." Proceedings of the 2013 ACM SIGMOD International Conference on Management of Data.
  • Документация проекта Rumble (GitHub).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →