すべてのjsonオブジェクトが有効であることを確認するためにjsonを検証する方法は? [閉鎖]

すべてのjsonオブジェクトが有効であることを確認するためにjsonを検証する方法は? [閉鎖]

私はjsonその中にいくつかのjsonオブジェクトがある以下のものを持っていますrootLevel。各jsonオブジェクトが次の規則に従うことを確認するには、jsonを検証する必要があります。

  • clientIdprocId各jsonオブジェクトの値は一意であるmachineName必要があります。一意でない場合は、一意でないものを印刷して失敗したいと思います。
  • 必須フィールドはclientId、、、、およびです。また、jsonオブジェクトに存在しない場合は失敗したいと思います。some_key6some_key7some_key8some_key9some_key10machineName

以下は私の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組み合わせや他の機能を使用することもできます。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データベース」)の使用を検討してください。

おすすめ記事