Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 用于展平对象数组的JMESPath表达式,每个对象都具有嵌套的对象数组_Json_Ansible_Jmespath - Fatal编程技术网

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

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"

我的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"}]
[
  {"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"},
  ...]