0

使用JSONiq 到JSONiq的 JavaScript实现,假设我有一个数组

let $a := [1,2,3]

我想将元素作为序列获取,但所有这些都返回数组本身 -

return $a()
return $a[]
return members($a)

提取数组成员的正确方法是什么?


我的最终目标是将数组中的对象转换为字符串,就像这样 -

let $updates := [
  {"address": "%Q0.1", "keys": ["OUT2", "output.2"], "value": 0},
  {"address": "%Q0.7", "keys": ["OUT8", "output.8"], "value": 1}
]

for $update in $updates()
return "<timestamp>|address|" || $update.address

为了将 JSON 对象数组转换为一组字符串,例如<timestamp>|address|%Q0.7,等


编辑:使用Zorba的 $a() 语法似乎可以正常工作 - 这是节点 jsoniq 解析器的问题吗?

例如

jsoniq version "1.0";

let $updates := [
  {"address": "%Q0.1", "keys": ["OUT2", "output.2"], "value": 0},
  {"address": "%Q0.7", "keys": ["OUT8", "output.8"], "value": 1}
]

for $update in $updates()
return current-dateTime() || "|address|" || $update.address

返回

2021-02-19T23:10:13.434273Z|地址|%Q0.1 2021-02-19T23:10:13.434273Z|地址|%Q0.7

4

1 回答 1

1

在核心 JSONiq 语法中,数组被转换为带有空对或方括号的序列(即提取其成员),如下所示:

$array[]

例子:

[1, 2, 3, 4][]

返回序列:

(1, 2, 3, 4)

这意味着查询将是:

let $updates := [
  {"address": "%Q0.1", "keys": ["OUT2", "output.2"], "value": 0},
  {"address": "%Q0.7", "keys": ["OUT8", "output.8"], "value": 1}
]

for $update in $updates[]
return "<timestamp>|address|" || $update.address

带有一对空括号的类似函数调用的表示法可以追溯到 JSONiq 的早期,因为它主要设计为 XQuery 的扩展,并且映射和数组是通过函数调用 ( $object("foo"), $array(), $array(2)) 导航的。然而,随着 JSONiq 开始拥有自己的生命,引入了更加用户友好和直观的 JSON 导航语法:

$array[[1]]

对于给定位置的数组成员查找

$object.foo

对于给定键的对象查找和

$array[]

用于数组拆箱。

虽然 JSONiq 对 XQuery 的扩展仍然存在于用户需要 JSON 和 XML 支持的场景(并且受到 Zorba 3.0、IBM Websphere 等的支持),但核心 JSONiq 语法是所有专门支持 JSON 的引擎的主要语法,例如隆隆声

一些引擎(包括 Zorba 3.0)同时支持核心 JSONiq 语法和 JSONiq 对 XQuery 的扩展,您可以通过语言版本声明选择您想要的:

jsoniq version "1.0";
[1, 2, 3, 4][]

对比

xquery version "3.0";
[1, 2, 3, 4]()

Zorba 相对宽松,甚至可能在其核心 JSONiq 实现中同时接受 () 和 []。

(警告:Zorba 2.9 不支持最新的核心 JSONiq 语法,特别是 try.zorba.io 页面仍然在 Zorba 2.9 上运行。如果你想使用它,你需要下载 Zorba 3.0 并在本地运行它)。

最后一点:JSON 导航也可以在数组和对象序列上并行工作:

(
  {"foo":1},
  {"foo":2},
  {"foo":3},
  {"foo":4}
).foo

返回

(1, 2, 3, 4)

尽管

(
  [1, 2],
  [3, 4, 5],
  [6, 7, 8]
)[]

返回

(1, 2, 3, 4, 5, 6, 7, 8)

这使得导航大型序列变得非常简单和紧凑:

$collection.foo[].bar[[1]].foobar[].foo
于 2021-02-20T06:30:05.613 回答