json - 用于展平对象数组的 JMESPath 表达式,每个对象都有嵌套的对象数组

标签 json ansible jmespath

我有一个包含数据库数组的 JSON,每个数据库都有一个用户数组,例如

{"databases": [
  {"db": "db_a", "users": [{"name": "alice"}, {"name": "alex"}]},
  {"db": "db_b", "users": [{"name": "bob"}, {"name": "brienne"}]}
]}

我想生成一个平面数组和用户,即
[
  {"db": "db_a", "name": "alice"},
  {"db": "db_a", "name": "alex"},
  {"db": "db_b", "name": "bob"},
  {"db": "db_b", "name": "brienne"}
]

在 SQL 术语中,这将是笛卡尔连接或笛卡尔积,但我不确定树结构中的正确术语。到目前为止我最接近的是
databases[].users[]

产生
[{"name": "alice"}, {"name": "alex"}, {"name": "bob"}, {"name": "brienne"}]


databases[].{db: db, name: users[].name}

产生
[
  {"db": "db_a", "name": ["alice", "alex"]},
  {"db": "db_b", "name": ["bob", "brienne"]}
]

附录:我很高兴接受“你不能用 JMESPath 做到这一点,这就是为什么......”作为答案。安 HN Comment ``提示这个

can't reference parents when doing iteration. Why? All options for iteration, [* ] and map, all use the iterated item as the context for any expression. There's no opportunity to get any other values in

最佳答案

一个选项是 loop subelements

  tasks:
    - set_fact:
        my_db: "{{ my_db + [ item.0|combine(item.1) ] }}"
      loop: "{{ lookup('subelements',databases,'users') }}"

关于json - 用于展平对象数组的 JMESPath 表达式,每个对象都有嵌套的对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54160360/

相关文章:

docker - 使用 Docker 管理开发/测试/生产环境

python-3.x - 如何使用 starts_with jmespath.search 字典键

python - 将 JSON 响应转换为 pandas 数据帧

javascript - 以优雅的方式将响应文本解析为键值对

regex - 使用 Ansible 正则表达式在文件中搜索字符串

windows - 如何使用ansible扩展windows路径变量

amazon-web-services - AWS CLI 和 JMESPath 过滤并选择嵌套属性

json - 需要jmespath查询输出过滤表达式的id属性

Python json 解析器允许重复键

java - 使用带有动态字段的 Jackson 注释反序列化 JSON