JMESPath - 如何修剪树

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

我有一个JSON数据结构(实际上,YAML),并希望重新格式化结构,但无法弄清楚如何使其正常工作。这将在Ansible的jinja2模板中使用。我试图使用的工具是json_query过滤器,它使用JMESPath。

输入:

"users": {
  "Administrators": [
    "user1",
    "user2": {
       "ssh_keys": "...."
    },
    "user3"
  ],
  "Users": [
     "user4"
  ]
}

我想把这个JSON改成这个(在过程中剥离ssh_key部分)

"Administrators": [
  "user1",
  "user2",
  "user3"
],
"Users": [
  "user4"
]

我怎么能在jinja2中这样做?我发现json_query过滤器看起来像是工作的正确工具,但还没有找到完成我要找的东西的查询。

ansible
1个回答
1
投票

首先,如果可以,我建议格式化json。一个好的格式会使这非常容易,例如:

"users": {
  "Administrators": [
    {"name": "user1, "ssh_keys": None},
    {"name": "user2, "ssh_keys": "...."},
    {"name": "user3, "ssh_keys": None},
  ],
  "Users": [
     "user4"
  ]
}

如果你不能这样做,试试这个(这是指Administrators,但适用于任何事情):

 - set_fact:
      admins: "{{ (users | json_query(item) | default([])) | union(admins | default([])) }}"
   with_items:
      - "Administrators[?type(@) == 'object'][keys(@)][][]"
      - "Administrators[?type(@)=='string']"

这将创建一个admins数组,其中只包含来自用户json的用户名。您可以设置包含管理员和用户的另一个事实

© www.soinside.com 2019 - 2024. All rights reserved.