JSONで引用されたJSONを解析する必要がある場合があります。 私は知っていますオプションのの属性には引用符付きのJSONが含まれています。 したがって、属性キーが使用可能なキーのリストに含まれているかどうかを確認したいと思います。jq:キーが定義済みのキーのリストにあるかどうかのテスト
# 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 "[email protected]"`"]"; }
parse_json_jq() { jq -c "
reduce keys[] as \$key
(.; if any((`to_array_string "[email protected]"`); . == \$key) and .[\$key] != null then .[\$key] |= fromjson else . end)
";}
このソリューションのThx。私はそれを動作させるために別の 'null'チェックを追加する必要がありました(質問への編集参照)。 – Juve