Каковы различия между JSONiq и XQuery 3.1?

И JSONiq, и XQuery 3.1 расширяют XQuery 3.0 с поддержкой JSON.

Чем они отличаются?

2 ответа

Решение

Общая мотивация

XQuery 3.1 был разработан с целью поддержки дополнительных структур данных (карт, массивов) в памяти. Эти структуры отображаются в JSON для ввода и вывода. XQuery 3.1 был рекомендацией W3C с марта 2017 года.

JSONiq был разработан с целью запроса и обновления JSON в таких настройках, как хранилища документов. Он также был разработан членами рабочей группы XML Query (заявление об отказе: я один из них) при изучении различных возможностей поддержки JSON. Хотя это и не официальная рекомендация, она является стабильной и публичной.

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

И XQuery 3.1, и JSONiq дополняют модель данных объектами и массивами, но делают это по-разному, мотивируя их различными фокусами. В целом, XQuery 3.1 имеет более общую модель данных, в то время как JSONiq ограничивает ее зеркалированием JSON.

В JSONiq ключи объекта должны быть строками. В XQuery 3.1 они могут иметь любое атомарное значение.

В JSONiq значения в объектах и ​​массивах должны быть отдельными элементами, в частности, массивы гомоморфны последовательностям, даже если они различны. В XQuery 3.1 значения в объекте и массивах могут быть последовательностями элементов.

В JSONiq нули представлены с выделенным атомарным типом. В XQuery 3.1 они представлены пустыми последовательностями (которые являются допустимыми значениями в модели данных).

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

строительство

Синтаксис для создания объектов и массивов в JSONiq - это расширенный набор JSON.

{ "foo" : [ 1 to 10 ] }

В XQuery 3.1 он похож на вычисляемые конструкторы узлов XML:

map { "foo" : array { 1 to 10 } }

XQuery 3.1 имеет альтернативный синтаксис для массивов, в которых запятые разделяют слоты для значений, чтобы вкладывать последовательности:

[ 1, (1 to 10), 11 ]

навигация

XQuery 3.1 использует вызовы функций для поиска в объектах и ​​массивах:

let $map := map { "foo" : "bar" }
return $map("foo")

let $array := array { 1, 2, 3 }
return $array(2)

Он также использует ? в качестве ярлыка для без кавычек имен и целых чисел:

let $map := map { "foo" : "bar" }
return $map?foo

let $array := array { 1, 2, 3 }
return $array?2

let $array := array { 1, 2, 3 }
return $array?*

JSONiq (основной язык) использует точки и квадратные скобки

let $map := { "foo" : "bar" }
return $map.foo

let $array := [ 1, 2, 3 ]
return $array[[2]]

let $array := [ 1, 2, 3 ]
return $array[]

(JSONiq также существует как расширение XQuery, которое также перегружает синтаксис вызова функции).

Я немного разочарован тем, как XQuery 3.1 поддерживает Json.

Одним из основных требований является полная совместимость с синтаксисом Json, который точно так же, как XQuery, совместимый с синтаксисом XML, и JSONiq, совместимый с синтаксисом Json, чтобы клиенты могли начать с существующих файлов Json. Пролог приемлем, если он должен явно включать синтаксис, совместимый с Json.

К сожалению, в стандартном XQuery 3.1 вы должны написать map{...}для объекта Json, true()для значения Json true, false()для значения Json false и ()для значения Json null. Преобразование файлов Json в шаблоны Json будет болезненным.

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

Вывод

JSONiq (при работе только с Json) и XQuery с расширением JSONiq (при работе как с XML, так и с Json) являются лучшими решениями для преобразования файлов Json в шаблоны Json.

Другие вопросы по тегам