import json from collections import defaultdict def parse_json_with_duplicates(json_string): """ 解析具有重复键的 JSON 字符串,将所有重复的键值对存储为列表。 Args: json_string (str): 需要解析的 JSON 字符串。 Returns: dict: 解析后的字典,重复的键对应的值为列表。 """ def custom_object_pairs_hook(pairs): d = defaultdict(list) for key, value in pairs: # 如果值是字典或列表,递归处理 if isinstance(value, dict): value = process_dict(value) elif isinstance(value, list): value = process_list(value) d[key].append(value) # 将有多个值的键转换为列表,单个值的键保持原样 return {key: (values if len(values) > 1 else values[0]) for key, values in d.items()} def process_dict(d): """ 递归处理字典,确保所有重复键的值为列表。 Args: d (dict): 需要处理的字典。 Returns: dict: 处理后的字典。 """ return custom_object_pairs_hook(d.items()) def process_list(l): """ 递归处理列表,确保列表中的所有字典也被处理。 Args: l (list): 需要处理的列表。 Returns: list: 处理后的列表。 """ return [process_dict(item) if isinstance(item, dict) else item for item in l] return json.loads(json_string, object_pairs_hook=custom_object_pairs_hook) # 示例使用 input_string = ''' { "商务评分": { "综合实力": { "评分": "5分", "要求": "投标人具备有效期内的 ISO9001质量体系认证证书、具备有效期内的OHSA18001职业健康安全体系认证证书、具备有效期内的 IS014001环境管理体系认证证书、具备有效期内的 ISO20000信息技术服务体系认证证书、具备有效期内的 ISO27001信息安全体系认证证书,全部满足得 5分,每缺一项扣 1分,(开标时需提供原件)。" }, "综合实力": { "评分": "2分", "要求": "投标人具备电子与智能化工程专业承包二级资质及以上证书得 2分,不能够提供不得分(开标时需提供原件)。" }, "综合实力": { "评分": "2分", "要求": "投标人具有建筑机电安装工程专业承包三级资质或以上资质得 2分,否则不得分。(证书开标原件备查)。" }, "综合实力": { "评分": "3分", "要求": "投标人需具有健全的信息技术运维服务能力,通过ITSS信息技术服务运维标准符合性认证得 3分,投标时需提供相关证书原件予以证明,否则不得分。" }, "综合实力": { "评分": "2分", "要求": "投标人具备 CCRC信息安全服务安全集成三级及以上证书得 2分,不能够提供不得分(开标时需提供原件)。" }, "类似业绩": { "评分": "4分", "要求": "近三年(自投标截止时间前推 36个月,以合同签订日期为准)中标人作为独立承包人有已完成的类似业绩项目(建设内容含应包含会议系统设备采购项目及改造),每提供一份业绩得 2分,最多可得 4分。(业绩证明材料须提供中标公示截图、中标通知书、合同复印件,开标时备查,否则不得分。)" }, "质量保证": { "评分": "2分", "要求": "投标人所投的MCU及视频会议终端设备产品,如果不是自己生产的,需提供制造商出具的授权及满足招标质保要求的售后服务承诺函,提供得 2分;(开标时提供授权书及售后服务承诺函原件予以证明,否则不得分。)" } } } ''' # 解析具有重复键的 JSON 字符串 parsed_data = parse_json_with_duplicates(input_string) # 打印结果 print(json.dumps(parsed_data, ensure_ascii=False, indent=4))