Каковы различия между 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.