我的问题如下: 我从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列中':'之前的预期字符串键 (具有不同行号/列号的无限循环)
答案 0 :(得分:0)
要基于.id
执行选择,可以使用以下示例技术:
jq --argjson id 10 -f select.jq <<< "$var"
其中select.jq包含:
.results[] | select( .id == $id )
在此处使用--argjson
避免了将字符串转换为数字的情况。
由于此处的jq过滤器太短,您可能希望在命令行中包括该过滤器,而不是将其放入文件中。