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