jsoniq和xquery 3.1都扩展了xquery3.0,支持json。
它们有何不同?
最佳答案
整体动机
XQuery3.1的设计目标是在内存中支持额外的数据结构(映射、数组)。这些结构被映射到json进行输入和输出。XQuery3.1自2017年3月以来一直是W3C的一项建议。
jsoniq的设计目标是在文档存储等设置中查询和更新json。它也是由xml查询工作组的成员(免责声明:我是其中之一)在研究支持json的各种可能性时设计的。虽然不是官方推荐,但稳定公开。
数据模型
XQuery3.1和JSONIQ都使用对象和数组扩展了数据模型,但是由于它们关注的焦点不同,所以扩展的方式也不同。总的来说,xquery 3.1有一个更通用的数据模型,而jsoniq将其限制为镜像json。
在jsoniq中,对象键必须是字符串。在XQuery3.1中,它们可以是任何原子值。
在jsoniq中,对象和数组中的值必须是单个项,特别是数组与序列同态,即使它们是不同的。在XQuery3.1中,对象和数组中的值可以是项序列。
在jsoniq中,空值用专用的原子类型表示。在XQuery3.1中,它们用空序列(在数据模型中是可接受的值)表示。
在XQuery3.1中,值不是通过填充数组或映射来复制的,它支持在XML节点上构建索引。在jsoniq中,复制与xml构造函数类似,以确保严格的树语义。
施工
jsoniq中构造对象和数组的语法是json的超集。
{ "foo" : [ 1 to 10 ] }
在XQuery3.1中,它类似于计算的XML节点构造函数:
map { "foo" : array { 1 to 10 } }
XQuery3.1为数组提供了另一种语法,其中逗号分隔值的槽,以嵌套序列:
[ 1, (1 to 10), 11 ]
导航
XQuery3.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的扩展存在,它也会重载函数调用语法)。