2017-05-17 2 views
0

나는 json을 무의미하게 파싱하려고하는데, 필요한 값을 얻었지만 출력은 배열입니다. 어떻게 가치를 얻을 수 있습니까?가능한 json_query에서 괄호를 제거하십시오.

예 JSON :

{ 
"Version": "2015-08-13", 
"Accounts": [{ 
    "AccountName": "account1", 
    "Regions": [{ 
     "RegionName": "region1", 
     "RegionId": "region1", 
     "RegionDetails": [{ 
      "id": "id1", 
      "version": "v1" 
     }, { 
      "id": "id2", 
      "version": "v2" 
     }] 
    }] 
}, { 
    "AccountName": "account2", 
    "Regions": [{ 
     "RegionName": "region1", 
     "RegionId": "region1", 
     "RegionDetails": [{ 
      "id": "id1", 
      "version": "v1" 
     }, { 
      "id": "id2", 
      "version": "v2" 
     }] 
    }] 
}] 
} 

Ansible 각본 예 :

- name: Set Global Vars 
     hosts: localhost 
     tasks:  
     - name: print json file 
      debug: 
      msg: "{{ (lookup('file','./example.json') | from_json) | json_query(query) }}" 
      vars: 
      query: "Accounts[?AccountName=='account1'][Regions[?RegionName=='region1'].RegionId]" 
     register: region_id 

Ansible 출력 :

TASK [print json file] ********************************************************* 
ok: [localhost] => { 
    "msg": [ 
     [ 
      [ 
       "region1" 
      ] 
     ] 
    ] 
} 

당신이 값 'REGION1'을 볼 수 있듯이 여전히 중첩됩니다. 어떻게하면 가치를 얻을 수 있습니까?

감사합니다.

답변

1

원래 데이터에는 중첩 목록이 있습니다. Accounts은 목록이며 각 계정에는 Regions 목록이 포함되어 있습니다.

JMESPath 쿼리를 사용하면 일부 기준에 따라 목록을 필터링하지만 데이터에는 AccountName=='account1'이라는 계정이 두 개 이상있을 수 있으므로 결과는 여전히 목록입니다.

먼저 계정을 발견하고 먼저 다음과 같이 해당 계정의 지역, 당신은 쿼리를 수정할 수 있습니다 발견 단지에 관심이 있다면 :

Accounts[?AccountName=='account1'] | [0].Regions[?RegionName=='region1'] | [0].RegionId 
+0

는 아 난을 참조하십시오. 설명 주셔서 감사합니다! – javajavajava

관련 문제