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

pau*_*aul 7 bash json jq

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

    curl -X GET -H "X-AppKey:foo" "foo/v2/_status" | jq '.component-status[]'
Run Code Online (Sandbox Code Playgroud)

我在jq的github上阅读了这篇文章https://github.com/stedolan/jq/issues/202,但我无法使其有效.

这是卷曲的输出

   {
  "status": "ok",
  "hostname": "0b0b495a46db",
  "component-status": [
   {
     "status-code": 200,
     "component": "Service1",
     "status": "OK"
   },
   {
     "status-code": 200,
     "component": "Service2",
     "status": "OK"
   }
  ]
 }
Run Code Online (Sandbox Code Playgroud)

任何的想法?

fed*_*qui 10

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

jq '.["component-status"]'
Run Code Online (Sandbox Code Playgroud)

根据您的给定输入,它返回:

[
  {
    "status": "OK",
    "component": "Service1",
    "status-code": 200
  },
  {
    "status": "OK",
    "component": "Service2",
    "status-code": 200
  }
]
Run Code Online (Sandbox Code Playgroud)

JQ手册(开发) - >基本过滤器:

.foo, .foo.bar
Run Code Online (Sandbox Code Playgroud)

最简单有用的过滤器是.foo.当给定JSON对象(也称为字典或散列)作为输入时,它会在键"foo"处生成值,如果不存在则生成null.

如果键包含特殊字符,则需要用双引号将其括起来,如下所示:."foo$".

从github问题如果字段名称有破折号,则无法选择字段:

目前,它被解析为减法.当密钥不符合标识符语法时,您始终可以显式使用字符串.

  • 手册的“开发版”(https://stedolan.github.io/jq/manual/)有其他版本的链接。jq FAQ (https://github.com/stedolan/jq/wiki/FAQ) 也讨论了这个问题。来自“开发版”: > 如果密钥包含特殊字符,则需要用双引号将其括起来,如下所示:."foo$"。 (2认同)
  • 我遇到了方括号(`。[“连字符字符串”]`)实际导致错误的情况:`jq:error:语法错误,意外的'[',期望使用FORMAT或QQSTRING_START(Unix shell引用问题? )在<top-level>`。只需添加双引号(`。“连字符字符串”`)即可。 (2认同)

Dim*_*Dev 7

rjurney 或他的答案的评论者建议的选项对我不起作用(可能是因为我使用了 PowerShell),但是在github 问题的答案中,有一个解决方案,它做到了这一点 - 用 \ 转义双引号

jq '.\"component-status\"'
Run Code Online (Sandbox Code Playgroud)

  • @DivDev - 请明确您想要的计算环境。此解决方案不适用于 bash 和类似 bash 的 shell。 (3认同)