我有一个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"
]
}
}
我们可以使用 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
组合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 数据库”)。