【问题标题】:How to access property via jq with special chars? [duplicate]如何使用特殊字符通过 jq 访问属性? [复制]
【发布时间】:2019-10-08 14:34:52
【问题描述】:

鉴于此 json 文件 wtf.json:

{
  "I-am-test-v2": {
    "exist": true
  },
  "works": {
    "exist": true
  }
}

我可以通过以下方式验证它是否拥有这些密钥:

$ jq 'keys' wtf.json 
[
  "I-am-test-v2",
  "works"
]

我可以通过以下方式访问works

$ jq .works wtf.json
{
  "exist": true
}

但我无法选择:

$ jq .I-am-test-v2 wtf.json

因为这会产生错误:

jq: error: am/0 is not defined at <top-level>, line 1:
.I-am-test-v2   
jq: error: test/0 is not defined at <top-level>, line 1:
.I-am-test-v2      
jq: error: v2/0 is not defined at <top-level>, line 1:
.I-am-test-v2           
jq: 3 compile errors

我认为它与特殊字符 - 有关,但我不确定如何引用或转义它,因为这些尝试也会失败并出现相同的错误:

 jq ".I-am-test-v2"  wtf.json 
 jq ."I-am-test-v2"  wtf.json

或通过以下方式出现一些不同的错误:

jq ."I\-am\-test\-v2"  wtf.json 
jq: error: syntax error, unexpected INVALID_CHARACTER, expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
.I\-am\-test\-v2  
jq: 1 compile error

我也试过了:

jq .["I-am-test-v2"] wtf.json

我应该如何访问密钥?

【问题讨论】:

  • 始终引用您的过滤器,最好在可用时使用单引号。否则,shell 将错误地解释所有内容并导致问题。

标签: json jq


【解决方案1】:

您的密钥包含破折号-,它被解释为减法运算符。

你需要通过双引号告诉jq这是一个字符串。

如果您在命令行中执行此操作,请将您的 jq "script" 括在单引号中,以避免您的 shell 解释任何特殊字符。

<wtf.json jq '."I-am-test-v2"' 

【讨论】:

    【解决方案2】:

    您可以通过以下方式正确引用它:

    jq '.["I-am-test-v2"]' wtf.json 
    {
      "exist": true
    }
    

    那么它也适用于转义:

    jq ".[\"I-am-test-v2\"]" wtf.json 
    

    请注意,您不能反转引用样式:

    jq ".['I-am-test-v2']" wtf.json 
    jq: error: syntax error, unexpected INVALID_CHARACTER (Unix shell quoting issues?) at <top-level>, line 1:
    .['I-am-test-v2']  
    jq: 1 compile error
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      相关资源
      最近更新 更多