JSONiq和XQuery 3.1都扩展了XQuery 3.0,支持JSON。
它们有何不同?
发布于 2017-07-05 07:19:11
整体动机
XQuery 3.1的目的是支持内存中的附加数据结构(映射、数组)。这些结构被映射到JSON进行输入和输出。自2017年3月以来,XQuery 3.1一直是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中,它们用空序列表示(这些序列是数据模型中接受的值)。
在XML3.1中,不通过填充数组或映射来复制值,后者支持在XQuery节点上构建索引。在JSONiq中,复制类似于XML构造函数,以确保严格的树语义。
施工
在JSONiq中构造对象和数组的语法是JSON的超集。
{ "foo" : [ 1 to 10 ] }在XML3.1中,它类似于计算的XQuery节点构造函数:
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的扩展存在,它也重载函数调用语法)。
发布于 2021-03-27 22:33:33
我对XQuery 3.1如何支持Json感到有点失望。
基本要求之一是完全兼容Json语法,Json语法只喜欢XQuery兼容XML语法,JSONiq兼容Json语法,这样客户就可以从现有的Json文件开始。prolog是可以接受的,如果必须显式启用与Json兼容的语法.
不幸的是,在标准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上工作)和XQuery具有JSONiq扩展(同时处理JSONiq和Json)是将Json文件转换为Json模板的更好解决方案。
https://stackoverflow.com/questions/44919443
复制相似问题