解析错误:第 1 行第 4 列的数值文本无效

parse error: Invalid numeric literal at line 1, column 4

提问人:v_ns 提问时间:10/12/2023 更新时间:10/12/2023 访问量:77

问:

我正在尝试使用解析 json,但它给出解析错误,我相信我的 Json 是有效的。jq

 echo {"ok":true,"elapsed":"317ns"} | jq -r '.ok'
jq: parse error: Invalid numeric literal at line 1, column 3

你能帮忙吗?

我尝试将“放在查询周围,然后它工作正常,但我无法理解第一个问题所在。


echo '{"ok":true,"elapsed":"317ns"}' | jq -r '.ok'
true
JSON 解析 JQ

评论

0赞 Nico Haase 10/12/2023
这个问题与编程有什么关系?是什么让您认为第一个命令应该有效?
1赞 pmf 10/12/2023
在不加引号的情况下,特殊字符(如 或)将由运行此命令的 shell 解释。然后,shell 对参数的评估(仅在本例中)被传递给要打印给 ,然后由 ,然后从 中拾取,这将正确地抱怨,因为这不再是 JSON。使用引号,它们之间的全部内容将原封不动地发送到同一流中,到达 ,它可以对其进行处理,因为它仍然是 JSON。{"ok:true elapsed:317nsechostdoutstdinjqjq

答:

1赞 glenn jackman 10/12/2023 #1

好吧,让我们看看 shell 如何处理该 echo 语句:

$ echo {"ok":true,"elapsed":"317ns"}
ok:true elapsed:317ns

发生了几件事:

  • 大括号消失了,
  • 逗号消失了,
  • 引号消失了。

假设你的 shell 是 bash,这在 3.5.1 大括号扩展和 3.5.9 引号删除中进行了解释

Shell 是棘手的语言。这就是为什么在任何地方使用引号很重要的原因。

echo '{"ok":true,"elapsed":"317ns"}' | jq -r '.ok'
# ...^.............................^

或者,如果 JSON 数据存储在变量中:

json='{"ok":true,"elapsed":"317ns"}'
echo "$json" | jq -r '.ok'
# ...^.....^