你们能教我如何使用jsoniq来显示书名是robin cruse和tom jones吗?我做了一些调查,但不管我怎么做,结果总是错的。
{
"books": {
"reader": {
"Read": {
"book": {
"name": "Robinson Crusoe",
"author": "Daniel Defoe"
}
},
"HaventRead": {
"book": {
"name": " Tom Jones",
"author": "Henry Fielding "
}
},
"_type": "Ken Rawing"
}
}
}
这就是我在zorba中所做的。它有很多错误,我很确定我的方法是完全错误的。请教我
for $reader in collection("books"),
$read in collection("books"),
$book in collection ("books")
where $reader.type eq "Ken Rawing"
return $book
从JSON文档中获取一些叶值是用导航语法完成的,这是.
符号。
不需要for
子句,因为迭代是隐式的.
。
假设对象存储在变量$content
中,$content.books.reader
导航到具有Read
和HaventRead
字段的对象。然后调用jnlib:values()
获取其中的两个对象,然后一个对象一直到名称的.book.name
。
查询是这样的(它的大部分实际上是输入文档本身,它通常存储在文件或数据存储中):
jsoniq version "1.0";
import module namespace jnlib = "http://jsoniq.org/function-library";
(: That's the input document, stored in a global variable :)
declare variable $content := {
"books": {
"reader": {
"Read": {
"book": {
"name": "Robinson Crusoe",
"author": "Daniel Defoe"
}
},
"HaventRead": {
"book": {
"name": " Tom Jones",
"author": "Henry Fielding "
}
},
"_type": "Ken Rawing"
}
}
};
(: That's the query :)
jnlib:values($content.books.reader).book.name
注意jsoniq version="1.0";
,它激活了本机JSONiq解析器(try.zorba.io
上的默认解析器是XQuery)。
也可以在zorba.io
中进行测试。注意
JSONiq也作为XQuery的扩展存在,在这种情况下,导航是通过函数调用完成的,因为.
是XML名称中的有效字符。但是,除非您也需要处理XML,否则不建议使用。
jnlib:values($content("books")("reader"))("book")("name")