jq没有使用短划线和数字处理标签名称

时间:2016-05-20 10:29:35

标签: json bash jq

我正在使用jq,但在我的json标签中使用“ - ”使jq无法编译。我无法逃避它使其成功。这里是命令

    curl -X GET -H "X-AppKey:foo" "foo/v2/_status" | jq '.component-status[]'

我已经在jq的github上阅读了这篇文章https://github.com/stedolan/jq/issues/202,但我无法让它发挥作用。

这是curl的输出

   {
  "status": "ok",
  "hostname": "0b0b495a46db",
  "component-status": [
   {
     "status-code": 200,
     "component": "Service1",
     "status": "OK"
   },
   {
     "status-code": 200,
     "component": "Service2",
     "status": "OK"
   }
  ]
 }

有什么想法吗?

2 个答案:

答案 0 :(得分:9)

您需要用括号和双引号括起来:

jq '.["component-status"]'

根据您的输入,它返回:

[
  {
    "status": "OK",
    "component": "Service1",
    "status-code": 200
  },
  {
    "status": "OK",
    "component": "Service2",
    "status-code": 200
  }
]

jq Manual (development) --> Basic filters

.foo, .foo.bar
     

最简单有用的过滤器是.foo。给定一个JSON对象(又名   字典或散列)作为输入,它产生键“foo”的值,   如果没有,则为null。

     

如果密钥包含特殊字符,则需要将其包围   双引号如下:."foo$"

来自github问题Cannot select field if field name has dashes

  

目前,它被解析为减法。你可以随时   当您的键不符合标识符语法时,显式使用字符串。

答案 1 :(得分:1)

option suggested by rjurney 或他的回答的评论者对我不起作用(可能是因为我使用了 PowerShell),但是在 the answer from github issue 中有一个解决方案,它起作用了 - 用双引号转义\

jq '.\"component-status\"'