ДОВІДНИК З NODE-RED українською мовою
На будь-якому кроці шляху розташування виділені елементи можуть бути відфільтровані за допомогою предиката - [expr]
, де expr
аналізується як вираз, що повертає булеве значення. Кожен елемент у виділенні перевіряється як вираз, якщо він дорівнює true
, то елемент залишається у виділенні, якщо false
, він видаляється з виділення. Вираз оцінюється відносно поточного (контекстного) елемента, що перевіряється, тому, якщо вираз предиката виконує навігацію, то вона проводиться відносно цього контексту.
У таблиці 11.3 показні приклади предикатів. Можна перевірити ці приклади, перейшовши на сайт `http://try.jsonata.org/ (виберіть приклад Address).
Приклад:
{"Phone": [
{"type": "home",
"number": "0203 544 1234"
},
{"type": "office",
"number": "01962 001234"
},
{"type": "office",
"number": "01962 001235"},
{"type": "mobile",
"number": "077 7700 1234"
}]}
Таблиця 11.3.
JSONata | Result | Коментар |
---|---|---|
Phone[type='mobile'] |
{"type": "mobile", "number": "077 7700 1234" } |
Вибирає елементи Phone, у яких є поле типу “mobile”. |
Phone[type='mobile'].number |
"077 7700 1234" |
вибір номерів мобільних телефонів |
Phone[type='office'].number |
["01962 001234", "01962 001235"] |
вибір офісних мобільних телефонів |
У виразі або підвиразі JSONata будь-яке значення (яке не є масивом) і масив, що містить тільки це значення, вважаються еквівалентними. Це дозволяє складати композицію таким чином, щоб шляхи розташування, які витягують одне значення з об’єктів і шляхи розташування, які витягують декілька значень з масивів, можуть бути використані як вхідні дані для інших виразів без використання іншого синтаксису для двох форм.
Наприклад (див вихідний текс JSON вище):
Address.City
повертає "Winchester"
Phone[0].number
повертає "0203 544 1234"
Phone[type='home'].number
повертає "0203 544 1234"
Phone[type='office'].number
повертає["01962 001234", "01962 001235"]
При наступній обробці поверненого з вираження JSONata значення, може бути бажаним мати результати в узгодженому форматі, незалежно від того, скільки співпадінь було і відповідно який формат поверненого значення (масив або одне значення). У перших двох виразах вище, очевидно, що кожен вираз звертається до одного значення в структурі і має сенс повернути саме це значення. В останніх двох виразах, однак, не є очевидним, скільки значень буде повернено, тому при наступній обробці прийдеться враховувати різні формати, що не є зручним.
Для таких випадків вираз можна змінити таким чином, щоб повернути масив, навіть якщо збігається лише одне значення. Це робиться шляхом додавання порожніх квадратних дужок [] до кроку в шляху розташування. Наведені вище приклади можуть бути переписані так, щоб завжди повертати масив, це виглядає наступним чином:
Address[].City
повертає [ "Winchester"]
Phone[0][].number
повертає [ "0203 544 1234" ]
Phone[][type='home'].number
повертає [ "0203 544 1234" ]
Phone[type='office'].number[]
повертає [ "01962 001234", "01962 001235" ]
Зауважимо, що []
можна розмістити у будь-якому місці предикатів і на будь-якому кроці вираження шляху
Використовуйте *
замість імені поля для вибору всіх полів в об’єкті. У таблиці 11.4 показні приклади предикату *
. Можна перевірити ці приклади, перейшовши на сайт http://try.jsonata.org/ (виберіть приклад Address).
Приклад:
{
"FirstName": "Fred",
"Surname": "Smith",
"Age": 28,
"Address": {
"Street": "Hursley Park",
"City": "Winchester",
"Postcode": "SO21 2JN"
}
}
Таблиця 11.4.
JSONata | Result |
---|---|
Address.* |
[ "Hursley Park", "Winchester", "SO21 2JN" ] |
*.Postcode |
"SO21 2JN" |
Шаблон нащадка **
замість *
буде відбирати всіх нащадків (багаторівневий шаблон).
Для прикладу з таблиці 11.1
**.Postcode
поверне [ "SO21 2JN", "E1 6RF" ]