如何调试 jq 解析 AWS 价格 API 的错误

问题描述 投票:0回答:2

我正在尝试解析一些 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'
json parsing jq
2个回答
2
投票

看起来你的程序对输入所做的假设是无效的。

我的猜测是您使用的是旧版本的 jq (可能是 jq 1.4),并且断言违规正在被 由 .attributes.instanceType 不是字符串(很可能为 null)的一种情况触发。

所以我建议首先修改你的程序来处理 .attributes.instanceType 不是字符串的情况。

例如:

select( .attributes.instanceType | (type == "string" and endswith($type)) )

有一个名为

debug
的方便过滤器用于调试,但在这种情况下,可能会得不偿失。


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
© www.soinside.com 2019 - 2024. All rights reserved.