在 jq 中处理具有特殊字符的 json 对象

Handling json object with special characters in jq

我有一个包含以下元素的 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 脚本中,我有以下代码片段,

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 对象中的 "Name"..

如何做到这一点?

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

  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

产量:

2.apiconsumer.alpha.sandbox.test.net.

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

如果要查看 JSON 字符串,请在不使用 -r 选项的情况下调用 jq。如果您想使用 -r 选项调用 jq 并希望看到两个反斜杠,则必须在 JSON.

中将它们编码为四个反斜杠