【发布时间】:2019-11-27 14:22:35
【问题描述】:
我的问题如下: 我从 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, “下一个”:空, “上一个”:空, “结果”: [ { “身份证”:10, "名称": "XXXXXXXXXXXXXXXXXX", "rd": "XXXXXXXXXXX", “租户”:XXXXXXXXXXXX, “enforce_unique”:XXXXXXXXXXXX, “描述”:“XXXXXXXXXXX”, “标签”:[], "display_name": "XXXXXXXXXXX", “custom_fields”:XXXXXXXXXXXX, “创建”:“XXXXXXXXXXX”, “last_updated”:“XXXXXXXXXXX” }, { “身份证”:11, "名称": "XXXXXXXXXXX", "rd": "XXXXXXXXXXX", “租户”:XXXXXXXXXXXX, “enforce_unique”:XXXXXXXXXXXX, “描述”:“XXXXXXXXXXX”, “标签”:XXXXXXXXXXX, "display_name": "XXXXXXXXXXX", “custom_fields”:XXXXXXXXXXXX, “创建”:“XXXXXXXXXXX”, “last_updated”:“XXXXXXXXXXX” }, . .. ... }
输出 - 预期结果(例如带有 id): 10 11 5 6 4 ...
实际结果:
1) null(无限循环)
2) 打开文件 10 的参数无效, jq:错误:无法打开文件“名称”::无效参数(使用不同键的无限循环)
3) ./filtering.sh:命令替换:第 11 行:意外标记附近的语法错误 ('
./filtering.sh: command substitution: line 11:./Downloads/jq-win64.exe '.id' JSON.parse($var))"'
4) jq: error (at :1): Cannot index string with string "id" 解析错误:第 1 行第 15 列的“:”之前的预期字符串键 (不同行/列号的无限循环)
【问题讨论】:
-
您的英语很好,但以后请更严格地遵循minimal reproducible example 准则。特别是,一个有效的 JSON sn-p 在这里是合适的。谢谢。
-
您需要在
for语句中为$data加上引号(注意它不是一个数组),在jq语句中为$var加上引号。