Я новичок в JSONATA, так что это, вероятно, довольно простая проблема форматирования, которую я еще не знаю. Мне нужно взять большой объект и уменьшить его до чего-то более управляемого. Я смог сделать это с объектами, но столкнулся с проблемой с определенной структурой данных. Это метаданные из списка изображений, где ключевые слова находятся в массиве объектов, каждый со структурой {"name": "keyword"}
. Так:
{
"body": {
"files": [
{
"id": 101936854,
"title": "Taco Salad",
"keywords": [
{
"name": "background"
},
{
"name": "baked"
},
{
"name": "beef"
}
]
},
{
"id": 412961542,
"title": "Fiji",
"keywords": [
{
"name": "beach"
},
{
"name": "sea"
},
{
"name": "tree"
}
]
}
]
}
}
Когда я использую запрос
$zip(body.files.id,body.files.title,body.files.[keywords.name])
{
"id": $[0],
"title": $[1],
"keywords": $[2]
}
Я получаю то, что хочу, но только первый объект, например:
{
"id": 101936854,
"title": "Taco Salad",
"keywords": [
"background",
"baked",
"beef"
]
}
Если я добавлю .
для вывода всех объектов, я верну несколько объектов, но только первое значение name
в массиве. Вот так:
$zip(body.files.id,body.files.title,body.files.[keywords.name]).
{
"id": $[0],
"title": $[1],
"keywords": $[2]
}
Получает:
[
{
"id": 101936854,
"title": "Taco Salad",
"keywords": "background"
},
{
"id": 412961542,
"title": "Fiji",
"keywords": "beach"
}
]
Я считаю, что это потому, что все входные объекты в этом массиве имеют один и тот же ключ name
. Итак, мне нужно каким-то образом получить все значения имени и поместить их в один массив с именем keywords
.
Если я не ошибаюсь, вы хотите что-то вроде этого:
body.files.{
"id": id,
"title": title,
"keywords": keywords.name
}
или вы можете поиграть с оператором преобразования:
(body ~> |files|{ "keywords": keywords.name }|).files
который производит этот вывод для вашего примера:
[
{
"id": 101936854,
"title": "Taco Salad",
"keywords": [
"background",
"baked",
"beef"
]
},
{
"id": 412961542,
"title": "Fiji",
"keywords": [
"beach",
"sea",
"tree"
]
}
]
Смотрите в прямом эфире здесь https://stedi.link/ybzLADi и здесь https://stedi.link/TLk7Loq
P.S. если вы хотите использовать для этого $zip, я думаю, вам придется избегать массивов массивов, чтобы JSONata не сглаживала результаты, одна из возможных реализаций:
$zip(
body.files.id,
body.files.title,
body.files.{"keywords": keywords.name}
).{
"id": $[0], "title": $[1], "keywords": $[2].keywords
}
Отлично, спасибо! Действительно, это был более рациональный подход, позволяющий избежать использования функции $zip. Предоставленная вами функция zip также работала хорошо, и спасибо за это. То, как функция обрабатывает входные данные, имеет больше смысла в этом примере, поэтому я многому научился из него.