Вытащите значение в jq с помощью экранированных переменных - PullRequest
0 голосов
/ 12 октября 2018

У меня есть JSON, который я пытаюсь обработать.Я использую jq и не могу за свою жизнь получить требуемый результат.

У меня есть простой пример, например ниже,

{
    "message" :"{ \"foo\": \"42\", \"bar\": \"less interesting data\"}"

}

My Build Up

jq '."message"

{
   "message" :{"foo": "42", "bar": "less interesting data"}
}

дает

{
  "foo": "42",
  "bar": "less interesting data"
}

."message"."bar"

дает

"less interesting data"

То есть

{
   "message" :"{"foo": "42", "bar": "less interesting data"}"
}

FAILS как недействительный JSON

{
   "message" :"{\"foo\": \"42\", \"bar\": \"less interesting data\"}"
}

FAILS 'jq: error (at: 3): Невозможно индексировать строку со строкой «bar». Статус выхода 5 '

Я пробовал целую кучу разных jq-запросов (я не буду тратить ваше время на их перечисление)

ТакЯ хотел бы получить несколько советов о том, как id получить "bar" из JSON

Это не дубликат строки преобразования в JSON, поскольку это приводит вас к идее преобразования.Без этого вопроса вы бы никогда не узнали, что ответом будет использование fromjson

1 Ответ

0 голосов
/ 12 октября 2018

Используйте конструкцию fromjson, чтобы восстановить строки в виде текстов JSON.Таким образом, учитывая содержимое ниже

{
    "message": "{ \"foo\": \"42\", \"bar\": \"less interesting data\" }"
}

, все, что вам нужно сделать для извлечения bar, это

jq '."message"|fromjson|.bar' file
"less interesting data"

Чтобы напечатать вывод без кавычек, используйте -r / --raw-ouput флаг, который выдает текст в необработанном формате.Как отмечено в комментариях fromjson.bar также должен работать как ожидалось.

...