2024-10-12 18:01:59 +08:00

93 lines
4.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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))