JSONiq 和 XQuery 3.1 有什么区别?



JSONiq和 XQuery 3.1 都通过支持 JSON 扩展了 XQuery 3.0

它们有何不同?

整体动机

XQuery 3.1 的设计目标是支持内存中的其他数据结构(映射、数组)。这些结构映射到 JSON 以进行输入和输出。XQuery 3.1 自 2017 年 3 月以来一直是 W3C 推荐标准。

JSONiq 旨在查询和更新文档存储等设置中的 JSON。它也是由XML查询工作组的成员设计的(免责声明:我是其中之一),同时调查支持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 兼容的语法,则 prolog 是可以接受的。

遗憾的是,在标准 XQuery 3.1 中,您必须为 Json 对象编写map{...},为 Json 值 true 编写true(),为 Json 值 false 编写false(),为 Json 值 null 编写()。将 JSON 文件转换为 JSON 模板将很痛苦。

XQuery 3.1 支持纯文本模板的穿插字符串。如果将 Json 文件转换为纯文本模板,则必须小心处理 XQuery 返回值,b/c 它不关心 Json 数据类型和转义引号字符串。

结论

JSONiq(仅在 JSON 上工作时)和带有 JSONiq 扩展名的 XQuery(同时处理 XML 和 Json 时)是将 Json 文件转换为 Json 模板的更好解决方案。

最新更新