Bash和cURL:从Web API检索JSON并搜索特定的key:value对

时间:2018-11-01 18:04:40

标签: json bash for-loop

我正在为应用程序/ json响应卷曲Web API,该响应是一组键值对,如下所示:

{"id":89,"name":"User saved 2018-07-03 12:01:47.337483","create_time":1530644507337,"auto":false,"recovered":false}
{"id":49,"name":"User saved 2018-05-24 12:33:53.927798","create_time":1527190433927,"auto":false,"recovered":false}
{"id":199,"name":"Daily backup 2018-10-22 02:37:37.332271","create_time":1540201057332,"auto":true,"recovered":false}

等,等等...

我想遍历此响应并找到“ id”键的最大值整数,然后将其另存为变量。如果以上是我的整个JSON,我将最终以variable = 199结束。

做这样的事情:

MY_VARIABLE=$(curl -k -X GET --header "Accept: application/json" \
--header "Authorization: MyAPITarget apikey=${MY_APIKEY}" \
"https://targetserver/api/methodImCalling" |

其输出是上面的JSON。我可以将输出通过管道传递给数组并对其进行迭代,但只查找“ id”的值,然后执行类似于a的操作:

for (i = 0; i < id.length; i++)

我只用了短时间的代码,这时我的大部分背景是JS,试图在这里建立bash的连接。我试图避免使用任何“已安装”工具,这就是为什么我使用bash的原因,我希望此脚本可以在任何linux / unix平台上“开箱即用”运行。有小费吗?谢谢!

1 个答案:

答案 0 :(得分:1)

这可能是一个单独的安装,但是您想要的工具是jq

max_id=$(curl ... | jq -s 'map(.id) | max')

人们可以期望预装的标准工具根本不适合使用JSON。

虽然不是标准的,但是任何安装了curl的计算机都可能安装了Python,并且您可以使用其标准的json模块来正确处理JSON。这是一个有点笨拙的单线:

curl ... | 
  python -c 'import json,sys; x="[%s]"%(",".join(sys.stdin),); print(max(y["id"] for y in json.loads(x)))'

其他非标准但通用的语言(Perl,Ruby等)可能也具有使用JSON的内置方法。