JSONiq 和 XQuery 3.1 扩展 XQuery 3.0 并支持JSON。
他们有何不同?
答案 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 模板的更好解决方案。