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 jq-当我已经深入对象时,如何打印对象的父值';谁的孩子?_Json_Jq - Fatal编程技术网

Json jq-当我已经深入对象时,如何打印对象的父值';谁的孩子?

Json jq-当我已经深入对象时,如何打印对象的父值';谁的孩子?,json,jq,Json,Jq,假设我有以下JSON,存储在变量jsonVariable中 我使用jq解析此JSON,方法如下: echo $jsonVariable | jq '.details.name | select(.name == "James Brown")' 这将给我输出 詹姆斯·布朗 但是如果我也想知道这个人的身份呢?现在,我知道这是一个粗略而简单的例子——我目前正在使用的程序有5到6个级别,有许多不同的JQ函数,而不是select。我需要一种方法来选择一个家长的领域,当我已经5或6层深后,进行各种过滤方法

假设我有以下JSON,存储在变量jsonVariable中

我使用jq解析此JSON,方法如下:

echo $jsonVariable | jq '.details.name | select(.name == "James Brown")'
这将给我输出

詹姆斯·布朗

但是如果我也想知道这个人的身份呢?现在,我知道这是一个粗略而简单的例子——我目前正在使用的程序有5到6个级别,有许多不同的JQ函数,而不是select。我需要一种方法来选择一个家长的领域,当我已经5或6层深后,进行各种过滤方法

有人能帮忙吗?有没有办法“反向”,回到父母身边?(不确定我说的是否有道理!)

试一试:

echo $jsonVariable | jq '{Name: .details.name, Id: .Id}  | select(.name == "James Brown")'

与其最多查询您要测试的值,不如最多查询包含您要查询的值和希望选择的值的根对象

您需要同时包含
id
名称的对象

$ jq --arg name 'James Brown' 'select(.details.name == $name).id' input.json

对于更通用的方法,请将“父”元素的值保存在所需的详细程度,然后在过滤器的末尾对其进行管道处理:

jq'。作为$parent |.details.name |选择(.==“詹姆斯·布朗”)|$parent'

当然,对于您公开的小案例,您可以完全忽略这一点:

jq'select(.details.name==“James Brown”)”


也可以考虑,如果您选择的筛选器返回单亲对象的许多匹配项,则每个匹配项将接收父对象的副本。您可能希望通过将父级以下的所有匹配项包装到一个数组中,确保您的选择筛选器只返回父级的一个元素,或者使用

unique

重复删除最终结果,这似乎是您想要的
.id | select(.name==“James Brown”)
您尝试过吗?啊,抱歉,没有正确解释。我希望你们俩都能像
那样做选择(.details |.name==(“詹姆斯·布朗”、“埃隆·马斯克”)|.id
伟大的解决方案。但为什么您会说“每次匹配都会收到父对象的副本”?$parent变量(或者更一般地说,我们可以称之为$ANCENTOR)应该绑定一次,然后当您沿着树向下并通过任何数组时,在该祖先下,您将始终得到第一次绑定到该变量的相同对象,而不是“副本”。即使是这样,为什么会有人在意呢?只要我能控制住我感兴趣的祖先,我就会没事的,不是吗?
$ jq --arg name 'James Brown' 'select(.details.name == $name).id' input.json