2017-05-17 141 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