You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 00:03:21