私はjson
その中にいくつかのjsonオブジェクトがある以下のものを持っていますrootLevel
。各jsonオブジェクトが次の規則に従うことを確認するには、jsonを検証する必要があります。
clientId
、procId
各jsonオブジェクトの値は一意であるmachineName
必要があります。一意でない場合は、一意でないものを印刷して失敗したいと思います。- 必須フィールドは
clientId
、、、、およびです。また、jsonオブジェクトに存在しない場合は失敗したいと思います。some_key6
some_key7
some_key8
some_key9
some_key10
machineName
以下は私のjsonです。現在、配列にはjsonオブジェクトが1つしかありませんが、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データベース」)の使用を検討してください。