У меня есть случай, когда мне нужно разобрать цитируемый JSON в JSON. Я знаю, какие необязательные атрибуты будут содержать JSON в кавычках, а какие нет. Поэтому я хочу проверить, есть ли ключи атрибутов в списке возможных ключей. У меня уже есть следующее:
# attributes "a" and "b" contain quoted JSON
echo '{"a":"{\"x\":1}","y":2}' |
jq -c '
def is_json($o): ["a","b"] | (map(select(. == $o)) | length) > 0;
with_entries(if is_json(.key) then .value = (.value|fromjson) else . end)
'
Это уже дает желаемый результат: {"a":{"x":1},"y":2}
. Однако проверка имени атрибута выглядит неуклюже, учитывая, что jq
предоставляет множество встроенных функций, таких как has
, in
, contains
, inside
и т. д.
Вопрос. Есть ли лучший способ проверить, находится ли ключ атрибута в заданном списке?
Изменить: вот текущее решение, основанное на ответе Пика.
#!/bin/bash
to_array_string() { echo "$*" | awk -v OFS='","' 'NF > 0 {$1=$1; print "\""$0"\""}'; }
to_json_array_string() { echo "["`to_array_string "$@"`"]"; }
parse_json_jq() { jq -c "
reduce keys[] as \$key
(.; if any((`to_array_string "$@"`); . == \$key) and .[\$key] != null then .[\$key] |= fromjson else . end)
";}