JSONiq 和 XQuery 3.1 之间有什么区别?
What are the differences between JSONiq and XQuery 3.1?
JSONiq 和 XQuery 3.1 都扩展了 XQuery 3.0 并支持JSON.
它们有什么不同?
总体动机
XQuery 3.1 旨在支持内存中的其他数据结构(映射、数组)。这些结构被映射到 JSON 用于输入和输出。自 2017 年 3 月以来,XQuery 3.1 一直是 W3C 推荐标准。
JSONiq 的设计目标是在文档存储等设置中查询和更新 JSON。它也是由 XML 查询工作组的成员(免责声明:我是其中之一)在研究支持 JSON 的各种可能性时设计的。虽然它不是官方推荐,但它很稳定并且 public.
数据模型
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 兼容语法,则序言是可以接受的。
不幸的是,在标准 XQuery 3.1 中,您必须为 Json 对象编写 map{...}
,为 Json 值 true 编写 true()
,为 Json 值为假,()
为 Json 值为空。将 Json 个文件转换为 Json 个模板会很痛苦。
XQuery 3.1 支持纯文本模板的散布字符串。如果将 Json 文件转换为纯文本模板,则必须小心处理 XQuery return 值,b/c 它不关心 Json 数据类型和转义引号字符串。
结论
JSONiq(仅在 Json 上工作时)和带有 JSONiq 扩展名的 XQuery(在 XML 和 Json 上工作时)是转换 Json 文件的更好解决方案进入 Json 个模板。
JSONiq 和 XQuery 3.1 都扩展了 XQuery 3.0 并支持JSON.
它们有什么不同?
总体动机
XQuery 3.1 旨在支持内存中的其他数据结构(映射、数组)。这些结构被映射到 JSON 用于输入和输出。自 2017 年 3 月以来,XQuery 3.1 一直是 W3C 推荐标准。
JSONiq 的设计目标是在文档存储等设置中查询和更新 JSON。它也是由 XML 查询工作组的成员(免责声明:我是其中之一)在研究支持 JSON 的各种可能性时设计的。虽然它不是官方推荐,但它很稳定并且 public.
数据模型
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 兼容语法,则序言是可以接受的。
不幸的是,在标准 XQuery 3.1 中,您必须为 Json 对象编写 map{...}
,为 Json 值 true 编写 true()
,为 Json 值为假,()
为 Json 值为空。将 Json 个文件转换为 Json 个模板会很痛苦。
XQuery 3.1 支持纯文本模板的散布字符串。如果将 Json 文件转换为纯文本模板,则必须小心处理 XQuery return 值,b/c 它不关心 Json 数据类型和转义引号字符串。
结论
JSONiq(仅在 Json 上工作时)和带有 JSONiq 扩展名的 XQuery(在 XML 和 Json 上工作时)是转换 Json 文件的更好解决方案进入 Json 个模板。