1

你们能教我如何使用 jsoniq 来显示 robin cruose 和 tom jones 这两个书名吗?我已经进行了一些研究,但无论我怎么做,它总是错的。

{
   "books": {
      "reader": {
         "Read": {
            "book": {
               "name": "Robinson Crusoe",
               "author": "Daniel Defoe"
            }
         },
         "HaventRead": {
            "book": {
               "name": " Tom Jones",
               "author": "Henry Fielding "
            }
         },
         "_type": "Ken Rawing"
      }
   }
}

这就是我在 zorba.io 中所做的,它有很多错误,我很确定我做的方式是完全错误的。请教我

for $reader in collection("books"),
$read in collection("books"),
$book in collection ("books")
where $reader.type eq "Ken Rawing"
return $book

4

1 回答 1

1

从 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")
于 2016-09-09T18:45:37.283 回答