【问题标题】:Transforming JSON array转换 JSON 数组
【发布时间】:2021-09-01 23:38:36
【问题描述】:

我需要有条件地转换 JSON 文件中定义的对象列表。剧本的问题是我需要转换以产生docker.networkid 的值。简单地说,我需要找出某种三元运算符来转换列表。该剧本的结果是:

"msg": "['baz', AnsibleUndefined]"

我需要

"msg": "['baz', 'bar']"

剧本:

vars:
  daemons: "{{ lookup('file','./test.json') | from_json }}"

  tasks:
    - name: Transform
      debug:
        msg: "{{ daemons | map(attribute='docker.network')  }}"

test.json:

[
  {
    "id": "foo",
    "docker": {
      "network": "baz"
    }
  },
  {
    "id": "bar",
    "docker": {
    }
  }
]

【问题讨论】:

    标签: json ansible jq


    【解决方案1】:

    例如

        - debug:
            msg: "{{ _list }}"
          vars:
            _list: "{{ _list_str|from_yaml }}"
            _list_str: |
              [
              {% for i in daemons %}
              {% if i.docker.network is defined %}
              {{ i.docker.network }},
              {% else %}
              {{ i.id }},
              {% endif %}
              {% endfor %}
              ]
    

    给予

      msg:
      - baz
      - bar
    

    【讨论】:

      【解决方案2】:

      您应该处理您的文件test.json,例如使用jq

      jq 'map(. |= if .docker.network then . else . + {"docker":{"network": .id}} end)' test.json
      

      将打印

      [
        {
          "id": "foo",
          "docker": {
            "network": "baz"
          }
        },
        {
          "id": "bar",
          "docker": {
            "network": "bar"
          }
        }
      ]
      

      您可以在页面中阅读更多内容:

      https://kaijento.github.io/2017/03/26/json-parsing-jq-simplifying-with-map/ https://stedolan.github.io/jq/manual/#Math Add new element to existing JSON array with jq

      并在页面上测试您的命令:

      https://jqplay.org/

      【讨论】:

      • test.json 是输入数据而不是预期结果。结果应该只包含 docker.network 或 id 的值。
      • 所以你可以使用 jq 来转换流而不是文件。 (与 linux 桩线)
      猜你喜欢
      • 2019-05-18
      • 1970-01-01
      • 2022-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-26
      相关资源
      最近更新 更多