Я хотел бы преобразовать ввод следующим образом:
{
"cluster1": {
"services": {
"service1": {
"name": "foo",
"version": 1.0
},
"service2": {
"name": "bar",
"version": 2.0
}
}
},
"cluster2": {
"services": {
"service3": {
"name": "test",
"version": 3.0
},
"service4": {
"name": "s4",
"version": 4.0
}
}
},
"cluster3": {
"services": {
"service5": {
"name": "s5",
"version": 5.0
}
}
},
"clusterx": {
"name": "value"
}
}
или это (неважно какой):
[
{
"key": "cluster1",
"value": {
"services": {
"service1": {
"name": "foo",
"version": 1.0
},
"service2": {
"name": "bar",
"version": 2.0
}
}
}
},
{
"key": "cluster2",
"value": {
"services": {
"service3": {
"name": "test",
"version": 3.0
},
"service4": {
"name": "s4",
"version": 4.0
}
}
}
},
{
"key": "cluster3",
"value": {
"services": {
"service5": {
"name": "s5",
"version": 5.0
}
}
}
},
{
"key": "clusterx",
"value": {
"name": "value"
}
}
]
в это:
[
{ "name": "service1", "value": {
"name": "foo",
"version": 1
},
{ "name": "service2", "value": {
"name": "bar",
"version": 2
},
{ "name": "service3", "value": {
"name": "test",
"version": 3
},
{ "name": "service4", "value": {
"name": "s4",
"version": 4
},
{ "name": "service5", "value": {
"name": "s5",
"version": 5
}
]
В общем, я хотел бы увидеть список всех сервисов в упорядоченном виде.
Возможно ли это сделать с помощью JMESPath?
Что у меня есть для второго типа ввода, так это: [?value.services].value.services
, который преобразует мои данные в это:
[
{
"service1": {
"name": "foo",
"version": 1
},
"service2": {
"name": "bar",
"version": 2
}
},
{
"service3": {
"name": "test",
"version": 3
},
"service4": {
"name": "s4",
"version": 4
}
},
{
"service5": {
"name": "s5",
"version": 5
}
}
]
Думаю, мне нужен еще один уровень сглаживания, но я не знаю, как это сделать.
Кстати, я использую Ansible, где json_query очень похож на JMESPath. Так что, если мы сможем добиться этого с помощью Ansible / json_query, это тоже прекрасно.
В Ansible я пробовал что-то вроде этого, что почти есть, но не совсем:
all_services: |
{{ input | dict2items | json_query('[?value.services].value.services') }}