JSONiq和XQuery 3.1有什么区别?

时间:2017-07-05 07:19:12

标签: json xml xquery jsoniq

JSONiq XQuery 3.1 扩展 XQuery 3.0 并支持JSON。

他们有何不同?

2 个答案:

答案 0 :(得分:7)

总体动力

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

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的扩展而存在,它也会重载函数调用语法)。

答案 1 :(得分:1)

我对 XQuery 3.1 如何支持 Json 有点失望。

基本要求之一是完全兼容Json语法,就像XQuery兼容XML语法和JSONiq兼容Json语法一样,让客户可以从现有的Json文件入手。序言是可以接受的,如果必须明确启用 Json 兼容的语法。

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

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

结论

JSONiq(仅适用于 Json)和带有 JSONiq 扩展的 XQuery(适用于 XML 和 Json)是将 Json 文件转换为 Json 模板的更好解决方案。