我正在尝试解析一些AWS price API json结果,并注意到我在字符串和对象验证方面遇到了一些错误,但无法弄清楚如何调试哪个对象或字符串{{1}窒息。
有人能指点我正确的方向吗?我已经尝试将jq
更改为endswith
以及包含,但所有都出现了不同的错误,因此我无法将错误的对象缩小(可能无法帮助json响应1.1M +线......)
有趣的是,使用startswith
可以获得我正在寻找的sku,但也会返回endswith($type)
我试着在 jv.c 中查看第721行,但我真的不知道C,所以我有点卡住了。
提前致谢。
SCRIPT:
jq: jv.c:721: jv_string_value: Assertion 'jv_get_kind(j) == JV_KIND_STRING' failed.
答案 0 :(得分:1)
问题在于,对于某些产品,没有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
答案 1 :(得分:1)
看起来你的程序假设输入无效。
我的猜测是你正在使用旧版本的jq(也许是jq 1.4),并且断言是违规的 由一个案例触发,其中.attributes.instanceType不是字符串(很可能是null)。
所以我建议首先修改程序来处理.attributes.instanceType不是字符串的情况。
例如:
select( .attributes.instanceType | (type == "string" and endswith($type)) )
有一个名为debug
的方便过滤器用于降级,但在这种情况下,它可能比它的价值更麻烦。