首页 > 解决方案 > 如何过滤删除json_query中的方括号?

问题描述

我有以下 json 文件,我正在尝试过滤值但得到双方括号,但我想使用 regex_replace 删除第一个方括号,但不知道这是如何工作的。这个 json 文件从那里存储在名为 config_params 的变量中我尝试过滤..

{
  "servers": {
    "server_details": [
      {
        "srv_make": "hp",
        "newip_address": "192.168.200.139",
        "newhostname": "hostbh1",
        "nic_macaddress": {
          "nic1-mac1_nic2-mac1": [
            "b8:83:03:81:4b:20",
            "b8:83:03:84:d5:1c"
          ],
          "nic1-mac2_nic2-mac2": [
            "b8:83:03:81:4b:20",
            "b8:83:03:84:d5:1c"
          ]
        },
        "vmotion_ip_address": "10.10.20.36",
        "iscsi_ip_address": "192.168.0.36",

      }
    ]
  }
}

mac_group_list: "{{ config_params | json_query('servers.server_details[*].nic_macaddress.nic1-mac1_nic2-mac1') }}"

        [
          [
            "b8:83:03:81:4b:20",
            "b8:83:03:84:d5:1c"
          ]
        ]

我期待输出如下 - 我如何在 json 查询中实现这一点。

  [
    "b8:83:03:81:4b:20",
    "b8:83:03:84:d5:1c"
  ]

谢谢

标签: ansiblejson-query

解决方案


您的结果是列表列表,并且您需要第一个元素。您可以简单地要求第一个元素,如下所示:

mac_group_list: >-
  {{ inputjson | json_query('servers.server_details[].nic_macaddress."nic1-mac1_nic2-mac1"')[0] }}"

或者你可以使用flatten过滤器:

mac_group_list: >-
  {{ inputjson | json_query('servers.server_details[].nic_macaddress."nic1-mac1_nic2-mac1"') | flatten }}

您也可以修复您的查询,但是如果不查看原始数据的样子,就很难回答。

更新

或者您可以像这样编写查询过滤器:

- set_fact:
    output: >-
      {{
        inputjson |
        json_query('servers.server_details[].nic_macaddress[]."nic1-mac1_nic2-mac1"[]')
      }}

为了便于阅读,我已经对其进行了重新格式化,但这实际上正是你现在所拥有的[],最后多了一个额外的内容。鉴于您的样本数据 - 已修复以满足我在对您的问题的评论中描述的假设 - 这会产生:

TASK [debug] *********************************************************************************************************************************************************************************
ok: [localhost] => {
    "output": [
        "b8:83:03:81:4b:20",
        "b8:83:03:84:d5:1c"
    ]
}

推荐阅读