我一直在使用API调用以JSON格式构造它,以便以后将其推入数据库。然后代码看起来像这样:
getPage() {
curl --fail -X GET 'https://api.app.com/v1/test?page=1&pageSize=1000&sort=desc'
-H 'Authorization: Bearer 123abc456pickupsticks789'
-H 'cache-control: no-cache'
}
getPage
| jq -c '.items | .[] | {landing_id: .landing_id, submitted_at: .submitted_at, answers: .answers, email: .hidden.email}'
> testpush.json
当我运行时,它会产生此错误: jq: error (at <stdin>:0): Cannot iterate over null (null)
我已经研究了诸如此类的解决方案,或该网站的该解决方案以及此响应。
常见的解决方案似乎是在[]
的前面使用?
,并且我在jq
线中朝底部尝试了它,但它仍然不起作用。它只是产生一个空的json文件。
我是从其他答案中误读了外卖,而不是将我的?
放在正确的位置?>
以防止.items
不是数组的可能性,您可以写:
.items | .[]?
甚至更强大:
try .items[]
等效于(.items[])?
。
总结:
-
try E
等于try E catch empty
-
try E
等于(E)?
(请注意,表达式.items[]?
和(.items[])?
并不相同。)
但是,这些都不会为无效JSON的输入提供保护。
P.S。将来,请遵循MCVE指南(http://stackoverflow.com/help/mcve);在当前情况下,如果您根据curl
命令产生的输出提供了说明性的JSON摘要。
有必要让JSON知道它可以在解析该数组时在意外值后继续。试试或?是理想的选择。
请记住,要么有必要保证数据,要么让解释器知道可以继续。这听起来可能是多余的,但这是一种防止更难跟踪/通知的意外结果的故障安全方法。另外,有必要意识到之间"测试"的差异?vs尝试。
假设 $ sample 符合JSON标准,代码将始终工作:
sample='{"myvar":1,"var2":"foo"}'
jq '{newVar: ((.op[]? | .item) // 0)}' <<< $sample
所以, op 数组是 null for $ $ sample 如上所述,但JQ很明显,它可以继续而无需要求您的干预/修复。
在在文档中尚不清楚)。作为不当使用?的一个例子:
sample='{"myvar":1,"var2":"foo"}'
jq '{newVar: (.op[].item? // 0)}' <<< $sample
so,如 op 是 null 它将导致错误,因为您告诉JQ在检索 .Item 虽然在尝试通过 null 进行迭代期间有错误的可能性(在这种情况下, .op [] ),而这种尝试发生在此之前检查 .Item 。另一方面,在这种情况下,尝试可以使用:
sample='{"myvar":1,"var2":"foo"}'
jq '{newVar: (try .op[].item catch 0)}' <<< $sample
这是一个很小的用途差异,可能导致结果很大差异