如何从每个对象的相同键中提取每个值

时间:2019-07-18 15:32:35

标签: json bash get jq

我的问题如下: 我从get请求的输出中获取一个json文件,并将其放在变量中。我在此变量中放置的是一个包含对象的结果表。每个对象具有相同的格式。例如,它们通常具有诸如“ id”和“ name”之类的键。例如,我想提取的是每个id的值,它是一个整数。

另一方面,这不是我的最终目标。这只是一步。即使这不是我的问题,我也要向您介绍此内容,以便将其具体化。我正在寻找的是,根据一个键和一个值,程序返回其指定键包含该值的对象。 我希望我已经说清楚了。

谢谢您的帮助!

我认为问题可能来自错误的输入,该输入不是JSON格式而是字符串。这是我尝试过的一些示例:

1)test="$(./Downloads/jq-win64.exe -ncR '.id' $var)" 2)test="$(./Downloads/jq-win64.exe '.id' $var)" 3)test="$(./Downloads/jq-win64.exe '.id' JSON.parse($var))" 4)test="$(./Downloads/jq-win64.exe '.id' <<< $var)"

#!/bin/bash
data="$(curl -H "Accept: application/json; indent=4" https://private-ip.net/api/path | ./Downloads/jq-win64.exe '.results')"
for var in ${data[*]}
do
     test="$(./Downloads/jq-win64.exe '.id' <<< $var)"
     echo "$test"
done

输入: {     “计数”:19,     “ next”:null,     “上一个”:null,     “结果”:[         {             “ id”:10,             “名称”:“ XXXXXXXXXXXXXXXXXXX”,             “ rd”:“ XXXXXXXXXXX”,             “承租人”:XXXXXXXXXXX,             “ enforce_unique”:XXXXXXXXXXX,             “说明”:“ XXXXXXXXXXX”,             “标签”:[],             “ display_name”:“ XXXXXXXXXXX”,             “ custom_fields”:XXXXXXXXXXX,             “创建”:“ XXXXXXXXXXX”,             “ last_updated”:“ XXXXXXXXXXX”         },         {             “ id”:11             “名称”:“ XXXXXXXXXXX”,             “ rd”:“ XXXXXXXXXXX”,             “承租人”:XXXXXXXXXXX,             “ enforce_unique”:XXXXXXXXXXX,             “说明”:“ XXXXXXXXXXX”,             “标签”:XXXXXXXXXXX,             “ display_name”:“ XXXXXXXXXXX”,             “ custom_fields”:XXXXXXXXXXX,             “创建”:“ XXXXXXXXXXX”,             “ last_updated”:“ XXXXXXXXXXX”         },         。         ..         ... }

输出-预期结果(例如ID): 10 11 5 6 4 ...

每个的实际结果:

1)空(无限循环)

2)无效的参数打开文件10, jq:错误:无法打开文件“名称” ::无效的参数(具有不同键的无限循环)

3)./filtering.sh:命令替换:第11行:意外令牌(' ./filtering.sh: command substitution: line 11:附近的语法错误。/Downloads/jq-win64.exe'.id'JSON.parse($ var))“'

4)jq:错误(在:1):无法索引字符串为“ id”的字符串 解析错误:第1行第15列中':'之前的预期字符串键 (具有不同行号/列号的无限循环)

1 个答案:

答案 0 :(得分:0)

要基于.id执行选择,可以使用以下示例技术:

jq --argjson id 10 -f select.jq <<< "$var"

其中select.jq包含:

.results[] | select( .id == $id )

在此处使用--argjson避免了将字符串转换为数字的情况。

由于此处的jq过滤器太短,您可能希望在命令行中包括该过滤器,而不是将其放入文件中。