如何用jq或json-glib-validate检测JSON文件中的重复顶级键?
如何用jq或json-glib-validate检测JSON顶级键重复?
可以用jq实现这个需求,json-glib-validate默认不检测重复键,需要额外处理但可靠性不足,jq的方案更适配CI场景。
用jq检测重复顶级键
jq能通过键统计和分组快速识别重复顶级键,还能输出错误信息并返回非零状态码,完美契合CI的失败触发逻辑。
执行以下命令即可完成检测:
jq -n 'input | keys | group_by(.) | map(select(length>1)) | if length>0 then ("Duplicate keys found: " + join(", ")) | halt_error(1) else empty end' file.json
命令说明:
-n:以null作为初始输入,确保只处理单个JSON对象input:读取目标JSON文件内容keys:提取所有顶级键group_by(.):将相同的键分组,重复键会被归到同一组map(select(length>1)):筛选出包含多个元素的组(即重复键)- 若存在重复键,输出错误提示并以状态码1退出;无重复则无输出,返回状态码0
测试效果:
- 当JSON含重复顶级键时,命令输出类似
Duplicate keys found: id1的信息,返回非零状态码触发CI失败 - 所有顶级键唯一时,命令无输出,返回状态码0,CI流程正常执行
关于json-glib-validate
json-glib-validate核心功能是验证JSON语法合法性,默认会忽略重复键(遵循多数JSON解析器行为,保留最后一次出现的键),不会主动检测重复键。
如果非要用它配合其他工具实现,需要先对JSON文本做预处理(比如用grep提取顶级键再统计),但这种方法容易误判(比如字符串内容中出现类似键的文本),可靠性远不如jq,因此不推荐。
你的Python实现参考
你已经实现的Python方案是可行的,代码如下:
import collections import json import sys def check_duplicates(pairs): count = collections.Counter(i for i,j in pairs) duplicates = ", ".join(i for i,j in count.items() if j>1) if len(duplicates) != 0: print("Duplicate keys found: {}".format(duplicates)) sys.exit(1) def validate(pairs): check_duplicates(pairs) return dict(pairs) with open("file.json", "r") as file: try: obj = json.load(file, object_pairs_hook=validate) except ValueError as e: print("Invalid json: %s" % e) sys.exit(1)
内容的提问来源于stack exchange,提问作者user22990699
相关产品推荐
相关产品推荐

