Я хочу использовать реляционную базу данных для анализа информации из JSON API от Songkick для локальных событий.
Объекты событий сложны и глубоко вложены, поэтому я хочу отфильтровать и сгладить объекты событий и преобразовать их в CSV, чтобы я мог загружать их стандартными инструментами.
Могу ли я использовать jq для фильтрации и сглаживания событий?
Типичный ответ от API слишком велик для отображения здесь. Я покажу упрощенную версию с той же относительной структурой.
Применение фильтра .resultsPage.results.event[]
к ответу создает поток таких объектов событий.
{
"start": {
"date": "2014-10-28"
},
"performance": [
{
"artist": {
"displayName": "James Keelaghan",
"identifier": [
{
"mbid": "08e5954e-efc0-4a95-95ac-d74cca5b79ff"
}
]
}
}
],
"venue": {
"displayName": "Live At The Star"
}
}
{
"start": {
"date": "2014-10-28"
},
"performance": [
{
"artist": {
"displayName": "Katy B",
"identifier": [
{
"mbid": "2df30b6c-997d-4c3f-abb5-5e0d6317ea57"
}
]
}
},
{
"artist": {
"displayName": "Becky Hill",
"identifier": [
{
"mbid": "27bc6f5b-4585-49ab-8d7d-c62b59f5f010"
}
]
}
}
],
"venue": {
"displayName": "O2 ABC"
}
}
Затем я хочу создать один выходной объект для каждого объекта в списке производительности. Эти новые объекты должны иметь атрибуты из содержащего объект события, такие как дата и место проведения.
Правильный вывод для примера будет выглядеть так.
{
"venue_name": "Live At The Star",
"artist_mbid": "08e5954e-efc0-4a95-95ac-d74cca5b79ff",
"artist_name": "James Keelaghan",
"start_date": "2014-10-28"
}
{
"venue_name": "O2 ABC",
"artist_mbid": "2df30b6c-997d-4c3f-abb5-5e0d6317ea57",
"artist_name": "Katy B",
"start_date": "2014-10-28"
}
{
"venue_name": "O2 ABC",
"artist_mbid": "2df30b6c-997d-4c3f-abb5-5e0d6317ea57",
"artist_name": "Becky Hill",
"start_date": "2014-10-28"
}
Если я проигнорирую mbid, этот фильтр jq даст мне то, что я хочу.
{
start_date: .start.date,
artist_name: .performance[].artist.displayName,
venue_name: .venue.displayName
}
Результат выглядит так.
{
"venue_name": "Live At The Star",
"artist_name": "James Keelaghan",
"start_date": "2014-10-28"
}
{
"venue_name": "O2 ABC",
"artist_name": "Katy B",
"start_date": "2014-10-28"
}
{
"venue_name": "O2 ABC",
"artist_name": "Becky Hill",
"start_date": "2014-10-28"
}
Я попробовал этот фильтр, чтобы получить mbid.
{
start_date: .start.date,
artist_name: .performance[].artist.displayName,
artist_mbid: .performance[].artist.identifier[].mbid,
venue_name: .venue.displayName
}
Результат выглядит так.
{
"venue_name": "Live At The Star",
"artist_mbid": "08e5954e-efc0-4a95-95ac-d74cca5b79ff",
"artist_name": "James Keelaghan",
"start_date": "2014-10-28"
}
{
"venue_name": "O2 ABC",
"artist_mbid": "2df30b6c-997d-4c3f-abb5-5e0d6317ea57",
"artist_name": "Katy B",
"start_date": "2014-10-28"
}
{
"venue_name": "O2 ABC",
"artist_mbid": "27bc6f5b-4585-49ab-8d7d-c62b59f5f010",
"artist_name": "Katy B",
"start_date": "2014-10-28"
}
{
"venue_name": "O2 ABC",
"artist_mbid": "2df30b6c-997d-4c3f-abb5-5e0d6317ea57",
"artist_name": "Becky Hill",
"start_date": "2014-10-28"
}
{
"venue_name": "O2 ABC",
"artist_mbid": "27bc6f5b-4585-49ab-8d7d-c62b59f5f010",
"artist_name": "Becky Hill",
"start_date": "2014-10-28"
}
Каждый объект выглядит правильно, но их слишком много! Дублируются объекты «Кэти Би» и «Бекки Хилл».
Как правильно сделать это в jq?