Доступ к объекту в массиве объектов в 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
Я пытаюсь вернуть название, автора и цену книг. Я могу вернуть массив, но всякий раз, когда я набираю индекс.
let $a:=$o.book[1].title
return $a
Я не получаю результатов. Мой ожидаемый результат будет
Everyday Italian
Любая помощь приветствуется.
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()
с Зорба 2.9). И вы можете "обернуть" последовательность обратно в массив с [ $sequence ]
, Это немного похоже на открытие или закрытие коробки.
Только массивы могут рекурсивно вкладывать, например, [ [1, 2], [3, 4]]
имеет два уровня вложенности, как и следовало ожидать от массивов JSON. Последовательности, однако, не гнездятся, т.е. ((1, 2), (3, 4)
такая же, как плоская последовательность (1, 2, 3, 4) с нулевым уровнем вложенности. Последовательности элементов являются основными гражданами JSONiq и совместимы с потоковым исполнением (например, фильтрация последовательности миллионов объектов без фактической ее материализации).
Сначала я планировал перебрать массив объектов, чтобы распечатать данные внутри объектов. Для 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" }