如何验证 json 以确保每个 json 对象都是有效的?

如何验证 json 以确保每个 json 对象都是有效的?

我有一个json如下所示的,其中有多个 json 对象rootLevel。我需要验证我的 json 以确保每个 json 对象应遵循以下规则:

  • clientIdprocId和每个 json 对象中的值machineName应该是唯一的。如果它们不是唯一的,那么我想通过打印不唯一的内容来失败。
  • 必填字段为:clientIdsome_key6some_key7some_key8some_key9some_key10machineName如果它们不存在于任何 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"
            ]
        }
}

我们可以使用 shell 脚本对每个 json 对象进行这些验证吗?或者还有其他适合的方法吗?我命名了几个键只是some_key#为了更容易理解,但一般来说它们有不同的名称。

答案1

测试值是否唯一

如果我想做一个快速地检查数组中的所有对象是否都具有 unique clientId,我只会用来jq打印该值并在 shell 中检查。

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

您还可以通过jq组合lengthuniqueunique_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 数据库”)。

相关内容