Estou usando uma API (do SyncroMSP ) que retorna dados JSON paginados. Posso obter o número de páginas e posso obter os dados com uma ferramenta como curl
. Cada pedaço é JSON válido, mas contém apenas um subconjunto dos dados totais que preciso.
Usando jq
ou não, como posso mesclar os tickets[]
elementos desses blocos de dados paginados novamente em um único documento JSON?
Aqui estão três pedaços de exemplo. Os tickets[]
arrays são bastante editados para esta questão e, na realidade, contêm até 25 entradas, e cada entrada de ticket contém muito mais elementos, incluindo pelo menos alguns arrays.
Exemplo JSON bloco 1 ( part_1.json
)
{
"tickets": [
{
"number": 4445,
"subject": "Your mailbox is almost full"
},
{
"number": 4444,
"subject": "Cannot VPN"
}
],
"meta": {
"total_pages": 3,
"page": 1
}
}
Exemplo JSON bloco 2 ( part_2.json
)
{
"tickets": [
{
"number": 4395,
"subject": "Trados Studio issue"
},
{
"number": 4394,
"subject": "Daily Backup Report(No Errors)"
}
],
"meta": {
"total_pages": 3,
"page": 2
}
}
Exemplo JSON bloco 3 ( part_3.json
)
{
"tickets": [
{
"number": 4341,
"subject": "Daily Backup Report(No Errors)"
},
{
"number": 4340,
"subject": "Windows Updates on VMs"
}
],
"meta": {
"total_pages": 3,
"page": 3
}
}
Neste caso o resultado esperado seria algo como isto:
{
"tickets": [
{
"number": 4445,
"subject": "Your mailbox is almost full"
},
{
"number": 4444,
"subject": "Cannot VPN"
},
{
"number": 4395,
"subject": "Trados Studio issue"
},
{
"number": 4394,
"subject": "Daily Backup Report(No Errors)"
},
{
"number": 4341,
"subject": "Daily Backup Report(No Errors)"
},
{
"number": 4340,
"subject": "Windows Updates on VMs"
}
]
}
A saída também poderia incluir o meta
hash, pois eu simplesmente o ignoraria, e não importaria qual meta.page
valor fosse transportado.
Você pode assumir que tickets[].number
é único e que não precisa preservar nenhuma ordenação nesse tickets[]
nível. Há complexidade suficiente nos dados reais para que eu não queira ter que declarar a estrutura JSON completa em nenhum código resultante.
Esta é minha tentativa atual, mas não sou particularmente forte com jq
. Existe uma maneira melhor - por exemplo, não chamar jq
duas vezes ou ser capaz de generalizar o código para que eu não precise especificar o nome do array de nível superior ( tickets
)?
cat part_{1,2,3}.json | jq '.tickets[]' | jq -n '{ tickets:[ inputs ] }'
Você pode usar
map | add
para mesclar todos os tickets em uma única matriz:Ou com parametrização de
tickets
,Ou com uma
jq
invocação: