如何调试jq错误以解析AWS price API

时间:2015-12-29 16:50:09

标签: json parsing jq

我正在尝试解析一些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.

2 个答案:

答案 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的方便过滤器用于降级,但在这种情况下,它可能比它的价值更麻烦。