93 lines
4.2 KiB
Python
93 lines
4.2 KiB
Python
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))
|