2017-05-17 138 views
0

我試圖在ansible中解析json,我得到了我需要的值,但輸出是一個數組。我怎樣才能得到價值?從ansible 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