在 jsoniq 中访问对象数组中的对象

access object in an object array in jsoniq

JSONIQ 的新手,使用 zorba 到目前为止我想做的是从 JSONIQ 的对象数组中的索引对象中提取一些信息。这是到目前为止的代码。

    jsoniq version "1.0";
    let $bstore:={
    "bookstore":
    {
        "book":[
            {
                "category":"cooking",
                "title":"Everyday Italian",
                "author":"Giada De Laurentiis",
                "year":"2005",
                "price":"30.00"
            },
            {
                "category":"web",
                "title":"XQuery Kick Start",
                "author":["James McGovern","Per Bothner","Kurt Cagle","James Linn","Vaidyanathan Nagarajan"],
                "year":"2003",
                "price":"49.99"
            }
        ]
    }
}
for $o in $bstore.bookstore
let $a:=$o.book
return $a.title

我想做的是 return 书名、作者和价格。 我能够 return 数组,但每当我键入索引时。

let $a:=$o.book[1].title
return $a

我没有得到任何结果。我的预期输出是

Everyday Italian

如有任何帮助,我们将不胜感激。

我最初计划遍历对象数组以打印出对象中的数据。对于 JSONIQ,我发现我需要用括号括起数组名称,在这种情况下为 book()。

我下面的代码应该遍历书名、作者和价格。

jsoniq version "1.0";
let $bstore:={
    "bookstore":
    {
        "book":[
            {
                "category":"cooking",
                "title":"Everyday Italian",
                "author":"Giada De Laurentiis",
                "year":"2005",
                "price":"30.00"
            },
            {
                "category":"web",
                "title":"XQuery Kick Start",
                "author":["James McGovern","Per Bothner","Kurt Cagle","James Linn","Vaidyanathan Nagarajan"],
                "year":"2003",
                "price":"49.99"
            }
        ]
    }
}
for $o in $bstore.bookstore.book()
return 
{
"title":$o.title,
"author":$o.author,
"price":$o.price
}

代码可以在Zorba进行测试。

输出如下图:

{ "title" : "Everyday Italian", "author" : "Giada De Laurentiis", "price" : "30.00" }{ "title" : "XQuery Kick Start", "author" : [ "James McGovern", "Per Bothner", "Kurt Cagle", "James Linn", "Vaidyanathan Nagarajan" ], "price" : "49.99" }

JSONiq 中的数组查找是使用双方括号完成的,如下所示:

let $a:=$o.book[[1]].title
return $a

但是请注意,try.zorba.io 页面基于 Zorba (2.9) 的早期版本,不支持最新版本的 JSONiq(它应该在某些时候升级观点)。在这个早期版本中,数组查找曾经是通过重载函数调用语法完成的:

let $a:=$o.book(1).title
return $a

如果您想使用稳定版的 JSONiq 及其最新的语法,您可以下载 Zorba 3.0 并在本地执行查询。

带有简单方括号的 [] 的语义是它通过一个序列进行过滤,使用位置或布尔过滤器,例如:

(1, 2, 3, 4)[2]

returns 2.

数组不同于序列。数组可以看作是一个 "boxed" 序列,即 (1, 2, 3, 4) 是一个包含四项的序列,但是 [1, 2, 3, 4] 是一个只有一项的序列:包含嵌套的 1, 2 的数组, 3 和 4.

如果需要,您可以使用 $o.book[] 将数组转换为序列(Zorba 2.9 为 $o.book())。您可以 "wrap" 将序列返回到带有 [ $sequence ] 的数组中。这有点像打开或关闭一个盒子。

只有数组可以递归嵌套,例如,[ [1, 2], [3, 4]] 有两层嵌套,这与 JSON 数组的预期完全一样。然而,序列不嵌套,即 ((1, 2), (3, 4) 与平面序列 (1, 2, 3, 4) 相同,具有零级嵌套。项目序列是 JSONiq 的主要公民,并且与流式执行兼容(例如,过滤数百万个对象的序列而不实际实现它)。