Использование Jsoniq для отображения некоторых строк в json

Не могли бы вы, ребята, научить меня, как использовать jsoniq для отображения названия книги - Робин Круз и Том Джонс? Я прошел какое-то исследование, но независимо от того, как я это делаю, это всегда неправильно.

{
   "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

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")
Другие вопросы по тегам