1

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

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

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

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

Everyday Italian

任何帮助将非常感激。

4

2 回答 2

2

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]

返回 2。

数组不同于序列。数组可以看作是一个“装箱”的序列,即(1, 2, 3, 4)是一个包含四个元素的序列,但[1, 2, 3, 4]它是一个只有一个元素的序列:包含嵌套的 1、2、3 和 4 的数组。

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

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

于 2018-09-12T14:52:05.763 回答
0

我最初计划遍历对象数组以打印出对象中的数据。对于 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" }
于 2018-09-12T13:44:56.003 回答