【问题标题】:Handling json object with special characters in jq在jq中处理带有特殊字符的json对象
【发布时间】:2020-06-19 04:26:25
【问题描述】:

我有一个带有以下元素的 json 对象,

rsrecords="{


 "ResourceRecords": [
        {
            "Value": "\"heritage=external-dns,external-dns/owner=us-east-1:sandbox,external-dns/resource=service/api""
        }
    ], 
    "Type": "TXT", 
    "Name": "\\052.apiconsumer.alpha.sandbox.test.net.", 
    "TTL": 300
}"

在我的 bash 脚本中,我有以下代码 sn-p,

jq  -r '.[] | .Name ,.ResourceRecords[0].Value' <<< "$rsrecords" | \
while read -r name; read -r value; do
  echo $name

输出打印为, \052.apiconsumer.alpha.sandbox.test.net.

但我希望它打印为\\052.apiconsumer.alpha.sandbox.test.net.,因为它是来自 json 对象的“名称”..

如何做到这一点?

【问题讨论】:

  • echo "$name"?
  • 确保您的示例是可重现的。在当前的形式中,它会产生一个语法错误

标签: bash sh jq


【解决方案1】:

在进入问题的核心之前,请注意

  1. 给定的示例数据有点混乱,所以我假设您的意思是:
rsrecords='
{
  "ResourceRecords": [
    {
      "Value": "heritage=external-dns,external-dns/owner=us-east-1:sandbox,external-dns/resource=service/api"
    }
  ],
  "Type": "TXT",
  "Name": "\\052.apiconsumer.alpha.sandbox.test.net.",
  "TTL": 300
}
'
  1. 您的 jq 查询与上述 JSON 不匹配,因此我假设您希望查询很简单:
.Name, .ResourceRecords[0].Value

无论如何,使用上面的 JSON,bash 命令:

jq  -r '.Name, .ResourceRecords[0].Value' <<< "$rsrecords" |
while read -r name; read -r value; do
    echo "$name"
done

产量:

\052.apiconsumer.alpha.sandbox.test.net.

这是正确的,因为 JSON 字符串 "\\X" 是原始字符串的编码:\X

如果您想查看 JSON 字符串,请调用不带 -r 选项的 jq。如果您想使用 -r 选项调用 jq 并希望看到两个反斜杠,则必须在 JSON 中将它们编码为四个反斜杠。

【讨论】:

    猜你喜欢
    • 2019-07-12
    • 2022-08-14
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    相关资源
    最近更新 更多