ansible json парсер для запроса нескольких значений объекта - PullRequest
1 голос
/ 20 апреля 2020

У меня есть данные json, и мне нужна помощь для анализа приведенных ниже данных json.

К сожалению, я провел пару дней и максимизировал свою удачу.

Необходимый вывод:

{
"id": "/subscriptions/xxx/providers/Microsoft.SqlVirtualMachine",
"namespace": "Microsoft.SqlVirtualMachine",
"resourceType": "SqlVirtualMachineGroups",
"apiVersions": "2017-03-01-preview"
}

Из приведенных ниже данных 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"
        }
      ]
    }
  ]
}

1 Ответ

0 голосов
/ 20 апреля 2020

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"
        }
    ]
...