Нужно отобразить JSON в список - PullRequest
0 голосов
/ 11 октября 2019

У меня есть переменная регистра со значением ниже json в качестве значения, и мне нужно извлечь name и dn из этого JSON в список. пробовал разные варианты, используя set_fact без всякой удачи.

{
    "nodes": {
        "status": -1,
        "imdata": [
            {
                "fabricNode": {
                    "attributes": {
                        "status": "",
                        "dn": "topology/pod-1/node-1",
                        "name": "NOQCJALAB1"
                    }
                }
            },
            {
                "fabricNode": {
                    "attributes": {
                        "status": "",
                        "dn": "topology/pod-1/node-1",
                        "name": "NOQCJALAB2"
                    }
                }
            }
        ],
        "totalCount": 2,
        "changed": false,
        "failed": false
    },
    "changed": false,
    "_ansible_verbose_always": true,
    "_ansible_no_log": false
}

Ответы [ 2 ]

0 голосов
/ 11 октября 2019

Можно использовать json_query . Например, задачи ниже

- set_fact:
    my_list: "{{ nodes.imdata|
                 json_query('[].{dn: fabricNode.attributes.dn,
                                 name: fabricNode.attributes.name}')
                                 }}"
- debug:
    var: my_list

дают

"my_list": [
    {
        "dn": "topology/pod-1/node-1", 
        "name": "NOQCJALAB1"
    }, 
    {
        "dn": "topology/pod-1/node-1", 
        "name": "NOQCJALAB2"
    }
]
0 голосов
/ 11 октября 2019

Вам нужно удалить посторонние вызовы на map('from_json'), потому что объект уже является dict

- set_fact:
    node_names: >-
      {{ (nodes.stdout | from_json).data
      | map(attribute='fabnode')
      | map(attribute='attributes')
      | map(attribute='dn')
      | list
      }}

. Вы хотите, чтобы эти map('from_json') вызывались, только если ваша структура данных содержит внедренный JSON, вот так:

- set_fact:
     inner_value: >-
        {{ (example_text | from_json).a_key
        | map("from_json")
        | map(attribute="inner_key")
        | list
        }}
  vars:
    example_text: |
      {"a_key": ["{\"inner_key\": \"inner value\"}"]}
...