JMESPath - 如何修剪一棵树

JMESPath - how to prune a tree

我有一个 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 过滤器,它似乎是完成这项工作的正确工具,但还没有找到一个查询来完成我正在寻找的东西。

首先,如果可以的话,我会建议重新格式化 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 的用户名。 比你可以设置另一个包含管理员和用户的事实