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