JSONiq
Парадигма | декларативный , функциональный , модульный |
---|---|
Дисциплина набора текста | динамичный , сильный |
ТЫ | Кросс-платформенный |
Расширения имен файлов | .jq, .jqy |
Веб-сайт | www |
Под влиянием | |
XQuery , SQL |
JSONiq — это язык запросов и функционального программирования , предназначенный для декларативного запроса и преобразования коллекций иерархических и разнородных данных в формате JSON , XML , а также неструктурированных текстовых данных.
JSONiq — это открытая спецификация , опубликованная под лицензией Creative Commons Attribution- ShareAlike 3.0. Он основан на языке XQuery , с которым использует одни и те же основные выражения и операции с атомарными типами . JSONiq поставляется в двух синтаксических вариантах, которые изначально поддерживают JSON и XML.
- Синтаксис JSONiq (расширенный набор JSON) расширен поддержкой XML посредством совместимого подмножества XQuery.
- Синтаксис XQuery (встроенная поддержка XML) дополнен поддержкой JSON через совместимое подмножество (расширение JSONiq для XQuery) вышеуказанного синтаксиса JSONiq.
Функции
[ редактировать ]JSONiq в первую очередь предоставляет средства для извлечения и преобразования данных из документов JSON или любого источника данных, который можно рассматривать как JSON (например, реляционные базы данных или веб-сервисы ).
Основным выражением для выполнения таких операций является SQL -подобное « выражение FLWOR », полученное из XQuery. Выражение FLWOR состоит из пяти предложений, после которых оно названо: FOR, LET, WHERE, ORDER BY, RETURN. Однако он также поддерживает предложения для группировки и работы с окнами.
Язык также предоставляет синтаксис для создания новых документов JSON, в которых имена и значения полей либо известны заранее, либо могут вычисляться динамически. Язык JSONiq (не расширение XQuery) является расширенным набором JSON. То есть каждый документ JSON является допустимой программой JSONiq.
Кроме того, язык также поддерживает навигационный синтаксис для извлечения имен и значений полей из объектов JSON, а также значений из массивов JSON. Навигация устойчива при отсутствии значений или если значения неоднородны, поскольку она молча игнорирует непредвиденные значения, не вызывая ошибок.
Все конструкции определяются как выражения внутри языка и могут иметь произвольную вложенность.
JSONiq не включает функции обновления документов JSON или XML, не имеет возможностей полнотекстового поиска и не имеет операторов. Все эти функции находятся в стадии активной разработки для следующей версии языка.
JSONiq — это язык программирования, который может выражать произвольные преобразования JSON в JSON или XML в XML. Он также позволяет выполнять преобразования между JSON и XML. Все подобные преобразования имеют следующие особенности:
- Логическая/физическая независимость данных
- Декларативный
- Высокий уровень
- Без побочных эффектов
- Строго типизированный
Модель данных
[ редактировать ]Язык основан на модели данных JSONiq (JDM), которая является расширением модели данных XQuery и XPath (XDM). JDM использует древовидную модель информационного содержания документа JSON или XML. Он содержит объекты JSON, массивы JSON, все виды узлов XML, а также атомарные значения, такие как целые числа, строки или логические значения, все они определены в XML Schema .
JDM формирует основу языка, ориентированного на множества, поскольку экземпляры модели данных представляют собой последовательности (одноэлементное значение считается последовательностью длины один). Элементами последовательности могут быть объекты JSON, массивы JSON, узлы XML или атомарные значения.
Примеры
[ редактировать ]Приведенный ниже пример кода JSONiq вычисляет код города и количество всех людей старше 20 лет из коллекции объектов JSON person ( JSON пример объекта см. в статье ).
for $p in collection("persons")
where $p.age gt 20
let $home := $p.phoneNumber[][$$.type eq "home"].number
group by $area := substring-before($home, " ")
return
{
"area code" : $area,
"count" : count($p)
}
Все конструкции JSONiq являются выражениями и также могут содержаться в теле функции.
declare function local:adults()
{
for $p in collection("persons")
where $p.age gt 20
return $p
};
Следующий запрос преобразует части каждого объекта person в элемент XML с использованием синтаксиса XQuery (расширение JSONiq для XQuery).
for $p in collection("persons")
return
<person>
<firstName>{$p("firstName")}</firstName>
<lastName>{$p("lastName")}</lastName>
<age>{$p("age")}</age>
</person>
Приложения
[ редактировать ]Ниже приведены несколько примеров того, как и где можно использовать JSONiq:
- Извлечение информации из базы данных для использования в веб-сервисе.
- Создание сводных отчетов по данным, хранящимся в хранилище документов JSON.
- Выбор и преобразование данных JSON в XHTML для публикации в Интернете.
- Сопоставление данных из различных источников и форматов (например, хранилище документов JSON, база данных XML, реляционная база данных и веб-служба) и предложение их в веб-службе.
- Преобразование коллекций объектов JSON в другую схему.
Сравнение двух синтаксических вариантов
[ редактировать ]Существует два синтаксиса JSONiq, которые пользователи могут использовать в зависимости от того, фокусируются ли они на JSON или XML. Оба синтаксиса используют одну и ту же модель данных и очень похожи, за некоторыми исключениями.
Синтаксис JSONiq
[ редактировать ]Чистый синтаксис JSONiq является расширенным набором JSON. Строго говоря, это не расширенный набор XQuery, хотя все его выражения и семантика доступны. Следующие аспекты синтаксиса JSONiq не совместимы с XQuery:
- Нет имен, содержащих точки.
- Нет . для элемента контекста (вместо этого следует использовать $$).
- Никаких литералов в одинарных кавычках.
- на основе обратной косой черты JSON, экранирование строковых литералов .
- В начале выражения относительного пути шаг оси не допускается.
Синтаксис XQuery с расширением JSONiq
[ редактировать ]Расширение JSONiq для XQuery является расширенным набором XQuery, но не расширенным набором JSON. Он полностью соответствует и обратно совместим с рекомендацией кандидата XQuery 3.0. Следующие аспекты JSONiq не поддерживаются в синтаксисе XQuery.
- Нет поиска объектов по точкам (вместо этого $object(“key”)).
- Нет $$ для элемента контекста.
- XML, экранирование строковых литералов на основе амперсанда.
- Ключи объекта должны быть заключены в кавычки
- Нет истинных/ложных/нулевых литералов
- Встроенные атомарные типы должны иметь префикс xs:.
- За неатомарными типами должны следовать круглые скобки.
- Пустая последовательность() должна быть написана как таковая.
- Нет поиска по массиву и распаковки массива [].
Дальнейшее чтение
[ редактировать ]- JSONiq — SQL NoSQL. Гислен Фурни. Независимая издательская платформа CreateSpace. ISBN 1489530371 .
Реализации
[ редактировать ]- Зорба : JSONiq и расширение JSONiq для XQuery
- IBM WebSphere : расширение JSONiq для XQuery
- Интернет-инструменты BeniBela : расширение JSONiq для XQuery