Обработка объекта json со специальными символами в jq - PullRequest
0 голосов
/ 19 июня 2020

У меня есть объект 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 script у меня есть фрагмент кода ниже,

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. .

Как это сделать?

1 Ответ

1 голос
/ 19 июня 2020

Прежде чем перейти к сути вопроса, обратите внимание, что

  1. приведенные образцы данных - это небольшая ошибка sh, поэтому я предполагаю, что вы имели в виду что-то вроде:
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
}
'
Ваш 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, вызовите jq без параметра -r. Если вы хотите вызвать jq с параметром -r и хотите увидеть две обратные косые черты, вам придется закодировать их как четыре обратных косых черта в вашем JSON.

...