나는 json
그 안에 여러 개의 json 객체가 있는 아래와 같은 것을 가지고 있습니다 rootLevel
. 각 json 객체가 다음 규칙을 따라야 하는지 확인하려면 json을 검증해야 합니다.
clientId
,procId
각 json 객체의 값은machineName
고유해야 합니다. 고유하지 않은 경우 고유하지 않은 것을 인쇄하여 실패하고 싶습니다.- 필수 필드는
clientId
,some_key6
,some_key7
,some_key8
및some_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
조합 이나 다른 기능을 사용할 수도 있습니다 .length
unique
unique_by
man 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 데이터베이스") 사용을 고려해보세요.