当前位置:  开发笔记 > 编程语言 > 正文

使用jq传递的数字参数--arg与==的数据不匹配

如何解决《使用jq传递的数字参数--arg与==的数据不匹配》经验,为你挑选了1个好方法。

以下是我的curl的示例JSON响应:

{
  "success": true,
  "message": "jobStatus",
  "jobStatus": [
    {
      "ID": 9,
      "status": "Successful"
    },
    {
      "ID": 2,
      "status": "Successful"
    },
   {
      "ID": 99,
      "status": "Failed"
    }
  ]
}

我想检查ID = 2的状态.这是我试过的命令:

cat test.txt|jq --arg v "2" '.jobStatus[]|select(.ID == $v)|.status'

回复:没有

我试着2没有引号的价值但仍然没有结果.

相比之下,如果我尝试使用文字 的命令2,它的工作原理:

cat test.txt | jq '.jobStatus[]|select(.ID == 2)|.status'

响应:

"Successful"

我被卡住了.任何人都可以帮我识别问题吗?



1> mklement0..:

jq是数据类型感知:

.ID,如JSON输入中定义的,是一个数字,

但是传递的任何命令行参数--arg(例如vhere)总是一个字符串(无论你是否引用值),

因此,为了比较它们,您必须使用显式类型转换,例如tonumber/1:

jq --arg v '2' '.jobStatus[] | select(.ID == ($v | tonumber)) | .status' test.txt

鉴于你只是在这里传递一个标量参数,下面的解决方案,使用--argjson(jqv1.5 +)有点过分,但它是显式类型转换替代方法,因为传递JSON参数实际上传递了类型化数据:

jq --argjson v '{ "ID": 2 }' '.jobStatus[] | select(.ID == $v.ID) | .status' test.txt

peak的答案表明即使--argjson v 2有效(在这种情况下$v直接与作品比较),这当然是简洁的解决方案,但可能需要解释:

尽管2可能看起来不像JSON,但它是:它是一个有效的JSON文本,包含一个类型为number的(参见json.org).

具体来说,事实上2是一个不带引号的标记,以一个数字开头,使得它成为JSON上下文中的数字(JSON 字符串 -值等价"2",来自shell必须传递'"2"'- 注意嵌入的双引号).

因此,jq解释--argjson -v 2数字,并且比较.ID == $v按预期工作(请注意,这同样适用于--argjson -v '2'/ --argjson -v "2",其中shell在jq看到值之前删除引号).
相比之下,您传递的任何内容--arg始终是按原样使用的字符串值.

换句话说:--argjson,其目的是接受任意JSON文本作为字符串(例如'{ "ID": 2 }'在上面的示例中),也可以用于传递数字字符串标量以强制将它们解释为数字.
相同的技术也适用于布尔字符串truefalse.


帽子的尖端为他的帮助达到顶峰.

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有