JQ:错误(AT< Stdin>:0):无法在null(null)上迭代

  • 本文关键字:null 迭代 Stdin AT 错误 JQ jq
  • 更新时间 :
  • 英文 :


我一直在使用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

这是一个很小的用途差异,可能导致结果很大差异

相关内容

最新更新