You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows下jq使用负索引解析JSON不生效 如何获取数组最后一项

问题根源

Windows的CMD、PowerShell与Linux Shell的参数解析逻辑存在差异:

  • Linux环境下,引号包裹的jq过滤器会被原样传入程序,[-1]负索引语法可被jq正常识别
  • Windows命令解释器会对参数中的方括号[]做特殊处理:CMD会把方括号识别为文件名通配符,PowerShell会对传入参数做额外类型转换,最终jq收到的过滤器参数和预期不符,解析返回null。另外Windows环境不识别单引号作为字符串边界,原命令中header参数用单引号包裹也可能导致传参异常。
解决方案

通用无转义方案(推荐,全平台兼容)

直接使用jq内置的last过滤器取数组最后一个元素,完全避开所有特殊字符转义问题,同一条命令在Windows、Linux、macOS下均可直接运行:

curl.exe -s --location --request GET "http://myhost:8080/api/v2/streams/stream/snapshots?idType=byName&name=mystream" --header "Accept:application/json" --user user1:xyz | jq ".snapshotsForStream | last.id"

执行后可直接返回最新快照ID24274。

负索引写法适配(不推荐,需对应环境转义)

如果要保留[-1]的索引写法,需要根据当前使用的命令行做对应转义:

  • 使用CMD时:将过滤器用双引号包裹,同时给方括号加CMD转义符^,写法为jq ".snapshotsForStream[^-1].id"
  • 使用PowerShell时:在jq参数前加停止解析标记--%,阻断PowerShell的参数解析逻辑,写法为jq --% '.snapshotsForStream[-1].id'

这类写法需要匹配当前shell调整规则,切换运行环境就可能失效,优先使用last的写法更稳妥。

内容的提问来源于stack exchange,提问作者Amit Kumar Jain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 12:31:02