Json 用于展平对象数组的JMESPath表达式,每个对象都具有嵌套的对象数组
我的JSON包含一个数据库数组,每个数据库都有一个用户数组,例如Json 用于展平对象数组的JMESPath表达式,每个对象都具有嵌套的对象数组,json,ansible,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"
{"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"}]
[
{"db": "db_a", "name": ["alice", "alex"]},
{"db": "db_b", "name": ["bob", "brienne"]}
]
及
产生
[{"name": "alice"}, {"name": "alex"}, {"name": "bob"}, {"name": "brienne"}]
[
{"db": "db_a", "name": ["alice", "alex"]},
{"db": "db_b", "name": ["bob", "brienne"]}
]
增编:我很高兴接受“你不能用JMESPath这么做,这就是为什么……”作为回答。一个``暗示了这一点
执行迭代时无法引用父级。为什么?迭代、[*]和映射的所有选项都使用迭代项作为任何表达式的上下文。没有机会获得任何其他价值观
一种选择是
仅使用JMESPath无法做到这一点,因为JMESPath表达式只能引用单个作用域。当当前作用域是用户对象时,无法访问外部作用域(数据库对象)。将允许访问其他作用域,但几年后仍未被接受
在Ansible上,它可以用其他过滤器(h/t Vladimir)和一些丑陋的过滤器来完成
databases_users: "{{
databases | subelements('users')
| to_json | from_json
| json_query('[*].{db: [0].db, name: [1].name}')
}}"
解释
提醒一下,我们的出发点是
[ {"db": "db_a", "users": [{"name": "alice"}, {"name": "alex"}]},
...]
子元素
过滤器将其转换为Python元组对列表
[ ({"db": "db_a", "users": [{"name": "alice"}, {"name": "alex"}]},
{"name": "alice"}),
...]
to_json
和from_json
将元组对转换为列表(JMESPath for Python忽略元组)
json\u query
选择所需的db
和user
值
[ {"db": "db_a", "name": "alice"},
...]
您希望我编辑/扩展您的答案,然后接受它吗?或者提交我自己的答案?当然,继续。jq过滤器可以做到:
.databases | map({db,name:.users[].name})
()。
[ {"db": "db_a", "name": "alice"},
...]