使用Json src doc中的键,使用Jmespath进行多选哈希

问题描述 投票:3回答:1

我有一个源json文档,如下所示:

# Source json
{
  "nics": {
    "vlan_internal": {
      "mac": "aa:aa:aa:aa:aa:aa"
    },
    "vlan_external": {
      "mac": "aa:aa:aa:aa:aa:bb"
    }
  }
}

使用ansible的json_query过滤器(使用jmespath),我想操作上面的json,以便输出json文档如下所示:

# Desired output json
{
  "vlan_internal": "aa:aa:aa:aa:aa:aa",
  "vlan_external": "aa:aa:aa:aa:aa:ab"
}

似乎我应该使用某种多选散列,但我找不到一个好的方法来获取输出json doc中的vlan名称(源json doc中的散列键,而不是散列值)。

我不知道前面的vlan的名字,所以我不能将vlan_internalvlan_external硬编码到jmespath表达式中。

我最接近的是这个jmespath表达式:

nics.{ vlans: keys(@), macs: *.mac }

这导致输出json doc几乎是有用的:

{
  "vlans": [
    "vlan_internal",
    "vlan_external"
  ],
  "macs": [
    "aa:aa:aa:aa:aa:aa",
    "aa:aa:aa:aa:aa:bb"
  ]
}

如果保证vlan名称列表的顺序和mac地址列表的顺序与源json文档的顺序相同,这对我有用。但jmespath规范清楚地表明,keys()函数不需要以任何特定顺序返回结果。由于我需要将vlan名称与正确的mac地址配对,这对我来说不起作用。

有人知道用jmespath实现这个目标的方法吗?

json ansible jmespath
1个回答
0
投票

首先,我不确定你是否应该经历所有那些蠢事。如果你不确定女巫的钥匙,那么你可以通过你的整个json迭代,所以,你知道你的item钥匙。

不过,如果您只想导出一个新的json,我无法找到使用本机JMESPath的方法。相反,我使用了一个ansible with_dict循环如下:

     - name: Create new nic_dict json
       set_fact:
          nic_dict: "{{ {item.key: item.value.mac} | combine(nic_dict | default({})) }}"
       with_dict: "{{ nics }}"

现在你可以使用看起来像这样的nic_dict

"nic_dict": {
    "vlan_external": "aa:aa:aa:aa:aa:bb",
    "vlan_internal": "aa:aa:aa:aa:aa:aa"
}
© www.soinside.com 2019 - 2024. All rights reserved.