모든 json 객체가 유효한지 확인하기 위해 json을 검증하는 방법은 무엇입니까? [폐쇄]

모든 json 객체가 유효한지 확인하기 위해 json을 검증하는 방법은 무엇입니까? [폐쇄]

나는 json그 안에 여러 개의 json 객체가 있는 아래와 같은 것을 가지고 있습니다 rootLevel. 각 json 객체가 다음 규칙을 따라야 하는지 확인하려면 json을 검증해야 합니다.

  • clientId, procId각 json 객체의 값은 machineName고유해야 합니다. 고유하지 않은 경우 고유하지 않은 것을 인쇄하여 실패하고 싶습니다.
  • 필수 필드는 clientId, some_key6, some_key7, some_key8some_key9입니다 some_key10. machineName또한 json 개체에 존재하지 않으면 실패하기를 원합니다.

아래는 내 json입니다. 현재 배열에는 json 개체가 하나만 있지만 rootLevel일반적으로 비슷한 방식이 많이 있습니다.

{
    "rootLevel": [
        {
            "clientId": 1234,
            "processId": 1,
            "clientName": "Hello",
            "some_key1": 4,
            "some_key2": 9,
            "some_key3": "rcb.com",
            "some_key4": 7,
            "some_key5": 301,
            "some_key6": 78,
            "some_key7": 2,
            "some_key8": 1,
            "some_key9": "USD",
            "some_key10": "en-US",
            "some_key11": 45,
            "some_key12": {
                "SportsId": [
                    "NBA"
                ],
                "Team": [
                    "RCB"
                ]
            },
            "procId": [
                1234
            ],
            "machineName": [
                "shop.hello.com"
            ]
        }
}

쉘 스크립트를 사용하여 각 json 객체에 대해 이러한 유효성 검사를 수행할 수 있습니까? 아니면 다른 적합한 방법이 있나요? some_key#이해하기 쉽도록 몇 가지 키의 이름을 지정했지만 일반적으로 이름이 다릅니다.

답변1

값이 고유한지 테스트

내가 하나 만들고 싶다면빠르게배열의 모든 개체가 고유한지 확인하려면 clientId이를 사용하여 jq값을 인쇄하고 셸에서 확인합니다.

< file.json jq '.rootLevel[].clientId' | awk '
    seen[$0]++ {print "FAILURE"; f=1; exit}
    END {if (!f) print "SUCCESS"}'

더 많은 기능을 얻기 위해 jq조합 이나 다른 기능을 사용할 수도 있습니다 .lengthuniqueunique_byman jq

사본만 인쇄

중복된 개체가 있는 모든 개체를 인쇄하려면 .clientId다음을 수행하십시오.

jq '.rootLevel | group_by(.clientId) | map(select(length>1))' file.json

group_by각각에 대해 별도의 배열이 생성되며 clientId여러 요소가 있는 배열, 즉 중복 요소가 있는 배열만 선택합니다 clientId. 또는 길이 함수를 추가하여 개수를 계산할 수 있습니다(값이 고유한지 테스트하는 또 다른 방법).

jq '.rootLevel | group_by(.clientId) | map(select(length>1)) | length' file.json

필드가 모든 객체에 존재하는지 테스트합니다.

이 json 배열의 모든 객체에 필드가 있는지 확인하려면 .processId다음을 수행합니다.

jq '.rootLevel[] | .processId?' file.json | grep -m1 null

그리고 grep의 종료 상태를 테스트하십시오. 이는 다음을 의미합니다.

if jq '.rootLevel[] | .processId?' file.json | grep -qm1 null; then
    echo "FAILURE"
else
    echo "SUCCESS"
fi

위의 지침과 함께 질문에 언급한 모든 작업을 수행할 수 있습니다.

유사한 작업을 많이 수행하는 경우 "JSON 데이터베이스"(또는 "문서 데이터베이스" 또는 "Nosql 데이터베이스") 사용을 고려해보세요.

관련 정보