我正在尝试解析一些 AWS 价格 API json 结果,并注意到我在字符串和对象验证方面遇到了一些错误,但无法弄清楚如何调试哪个对象或字符串
jq
被阻塞.
有人可以帮我指出正确的方向吗?我尝试将
endswith
更改为 startswith
以及 contains,但都表现出不同的错误,因此我无法缩小错误对象的范围(可能对 json 响应没有帮助,因为 1.1M+ 行。 ..)
有趣的是,使用
endswith($type)
可以获得我正在寻找的 sku,但也会返回 jq: jv.c:721: jv_string_value: Assertion 'jv_get_kind(j) == JV_KIND_STRING' failed.
我尝试查看 jv.c 中的第 721 行,但我不太了解 C,所以我有点卡住了。
提前致谢。
脚本:
#!/bin/bash
type="hs1.8xlarge"
curl -s -L -k https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonEC2/current/index.json | jq --arg type "$type" '.products[] | select(.attributes.instanceType | endswith($type)).sku'
看起来你的程序对输入所做的假设是无效的。
我的猜测是您使用的是旧版本的 jq (可能是 jq 1.4),并且断言违规正在被 由 .attributes.instanceType 不是字符串(很可能为 null)的一种情况触发。
所以我建议首先修改你的程序来处理 .attributes.instanceType 不是字符串的情况。
例如:
select( .attributes.instanceType | (type == "string" and endswith($type)) )
有一个名为
debug
的方便过滤器用于调试,但在这种情况下,可能会得不偿失。
问题是,对于某些产品来说,没有
instanceType
属性。 我不确定您使用的 jq 版本是什么,但 1.5 给出以下错误:
$ jq --arg type "$type" '.products[] | select(.attributes.instanceType | endswith($type)).sku' input.json
jq: error (at input.json:1128400): endswith() requires string inputs
这表明正在比较的值不是字符串。
$type
所以唯一剩下的就是instanceType
我不知道是否有一种简单的方法来调试此类问题,但我通常会从每一步分解过滤器并检查结果开始(并处理输入的本地副本)。 从 .products[].attributes
开始,然后是 .products[].attributes.instanceType
,看看它是否符合我的预期。
要解决您的特定问题,您只需在没有
instanceType
时提供一个字符串值。
.products[] | select(.attributes.instanceType // "" | endswith($type)).sku