TL; DR
Этот запрос работает:
value[*].{id: id, namespace: namespace, resourceType: resourceTypes[0].resourceType, apiVersion: resourceTypes[0].apiVersions[0]}
Шаг 1: давайте исправим ошибку в JSON
Кажется, ваш JSON
имеет ошибка в его структуре. Если вы исследуете его в jsonui
, вы увидите:
┌─ tree ─────────────────────────────┐ ┌─ text ───────────────────────────────────────────────────────────────────────────────────
│root │ │{
│└─ value │ │ "value": [
││ └─ [0] │ │ {
││ │ ├─ authorizations │ │ "authorizations": [
││ │ │ └─ [0] │ │ {
││ │ │ │ ├─ applicationId │ │ "applicationId": "xxx",
││ │ │ │ └─ roleDefinitionId │ │ "roleDefinitionId": "xxx"
││ │ ├─ id │ │ }
││ │ ├─ namespace │ │ ],
││ │ └─ resourceTypes │ │ "id": "/subscriptions/xxx/providers/Microsoft.SqlVirtualMachine",
││ │ │ ├─ [0] │ │ "namespace": "Microsoft.SqlVirtualMachine",
││ │ │ │ ├─ apiVersions │ │ "resourceTypes": [
││ │ │ │ │ └─ [0] │ │ {
││ │ │ │ ├─ capabilities │ │ "apiVersions": [
││ │ │ │ ├─ defaultApiVersion │ │ "2017-03-01-preview"
││ │ │ │ ├─ locations │ │ ],
││ │ │ │ │ └─ [0] │ │ "capabilities": "CrossResourceGroupResourceMove, CrossSubscriptionResourceMo
││ │ │ │ └─ resourceType │ │ "defaultApiVersion": "2017-03-01-preview",
││ │ │ └─ [1] │ │ "locations": [
││ │ │ │ ├─ authorizations │ │ "West Central US"
││ │ │ │ │ └─ [0] │ │ ],
││ │ │ │ │ │ ├─ applicationId │ │ "resourceType": "SqlVirtualMachineGroups"
││ │ │ │ │ │ └─ roleDefinitionI│ │ },
││ │ │ │ ├─ id │ │ {
││ │ │ │ ├─ namespace │ │ "authorizations": [
││ │ │ │ ├─ registrationPolicy │ │ {
││ │ │ │ ├─ registrationState │ │ "applicationId": "xxx",
││ │ │ │ └─ resourceTypes │ │ "roleDefinitionId": "xxx"
││ │ │ │ │ └─ [0] │ │ }
││ │ │ │ │ │ ├─ apiVersions │ │ ],
││ │ │ │ │ │ │ └─ [0] │ │ "id": "/subscriptions/xxx/providers/Microsoft.ChangeAnalysis",
││ │ │ │ │ │ ├─ capabilities │ │ "namespace": "Microsoft.ChangeAnalysis",
││ │ │ │ │ │ ├─ locations │ │ "registrationPolicy": "RegistrationRequired",
││ │ │ │ │ │ └─ resourceType │ │ "registrationState": "Registered",
│ │ │ "resourceTypes": [
Как вы можете заметить, [1]
вложен в resourceTypes
, хотя он должен быть частью массива value[]
.
Итак, исправлено JSON
выглядит корректно:
JSON:
{
"value": [
{
"id": "/subscriptions/xxx/providers/Microsoft.SqlVirtualMachine",
"namespace": "Microsoft.SqlVirtualMachine",
"authorizations": [
{
"applicationId": "xxx",
"roleDefinitionId": "xxx"
}
],
"resourceTypes": [
{
"resourceType": "SqlVirtualMachineGroups",
"locations": [
"West Central US"
],
"apiVersions": [
"2017-03-01-preview"
],
"defaultApiVersion": "2017-03-01-preview",
"capabilities": "CrossResourceGroupResourceMove, CrossSubscriptionResourceMove, SupportsTags, SupportsLocation"
}
]
},
{
"id": "/subscriptions/xxx/providers/Microsoft.ChangeAnalysis",
"namespace": "Microsoft.ChangeAnalysis",
"authorizations": [
{
"applicationId": "xxx",
"roleDefinitionId": "xxx"
}
],
"resourceTypes": [
{
"resourceType": "operations",
"locations": [],
"apiVersions": [
"2019-04-01-preview"
],
"capabilities": "None"
}
],
"registrationState": "Registered",
"registrationPolicy": "RegistrationRequired"
}
]
}
JSON UI :
┌─ tree ───────────────────────┐ ┌─ text ──────────────────────────────────
│root │ │{
│└─ value │ │ "value": [
││ ├─ [0] │ │ {
││ │ ├─ authorizations (+) │ │ "authorizations": [
││ │ ├─ id │ │ {
││ │ ├─ namespace │ │ "applicationId": "xxx",
││ │ └─ resourceTypes (+) │ │ "roleDefinitionId": "xxx"
││ └─ [1] │ │ }
││ │ ├─ authorizations (+) │ │ ],
││ │ ├─ id │ │ "id": "/subscriptions/xxx/provide
││ │ ├─ namespace │ │ "namespace": "Microsoft.SqlVirtua
││ │ ├─ registrationPolicy │ │ "resourceTypes": [
││ │ ├─ registrationState │ │ {
││ │ └─ resourceTypes (+) │ │ "apiVersions": [
│ │ │ "2017-03-01-preview"
Выглядит правильно, не правда ли?
К вашему сведению:
diff -b original.json fixed.json
1c1
< {
---
> {
22a23,24
> }
> ]
47,48d48
< }
< ]
Шаг 2: правильный анализ JSON
parse.yml :
---
- hosts: localhost
vars:
version_file: "{{ lookup('file','fixed.json') | from_json }}"
tasks:
- name: Printing the file.
debug: msg="{{ version_file | json_query(jmesquery) }}"
vars:
jmesquery: "value[*].{id: id, namespace: namespace, resourceType: resourceTypes[0].resourceType, apiVersion: resourceTypes[0].apiVersions[0]}"
И O / P :
"msg": [
{
"apiVersion": "2017-03-01-preview",
"id": "/subscriptions/xxx/providers/Microsoft.SqlVirtualMachine",
"namespace": "Microsoft.SqlVirtualMachine",
"resourceType": "SqlVirtualMachineGroups"
},
{
"apiVersion": "2019-04-01-preview",
"id": "/subscriptions/xxx/providers/Microsoft.ChangeAnalysis",
"namespace": "Microsoft.ChangeAnalysis",
"resourceType": "operations"
}
]