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 →