54 lines
3.2 KiB
Python
54 lines
3.2 KiB
Python
|
import json
|
|||
|
import re
|
|||
|
|
|||
|
|
|||
|
def transform_json(input_json):
|
|||
|
# 解析输入的JSON字符串
|
|||
|
data = json.loads(input_json)
|
|||
|
|
|||
|
# 创建一个新的字典来存储转换后的结果
|
|||
|
result = {}
|
|||
|
|
|||
|
# 用于临时存储各个层级的字典
|
|||
|
temp = {0: result}
|
|||
|
|
|||
|
# 遍历原始JSON的键值对
|
|||
|
for key, value in data.items():
|
|||
|
# 使用正则表达式判断键名的层级
|
|||
|
match = re.match(r'(\d+)(?:\.(\d+))?(?:\.(\d+))?', key)
|
|||
|
if match:
|
|||
|
levels = [int(l) for l in match.groups() if l is not None]
|
|||
|
|
|||
|
# 获取当前层级的父级字典
|
|||
|
parent = temp[len(levels) - 1]
|
|||
|
|
|||
|
# 如果是最后一层,直接添加值
|
|||
|
if len(levels) == len(match.groups()):
|
|||
|
if isinstance(parent, list):
|
|||
|
parent.append(value)
|
|||
|
else:
|
|||
|
parent[value.split()[0]] = value
|
|||
|
else:
|
|||
|
# 如果不是最后一层,创建新的列表或字典
|
|||
|
new_key = value.split()[0]
|
|||
|
if new_key not in parent:
|
|||
|
parent[new_key] = [] if isinstance(parent, dict) else {}
|
|||
|
temp[len(levels)] = parent[new_key]
|
|||
|
|
|||
|
return json.dumps(result, ensure_ascii=False, indent=2)
|
|||
|
|
|||
|
|
|||
|
# 输入的JSON字符串
|
|||
|
input_json = '''{
|
|||
|
"6.": "评标",
|
|||
|
"6.1": "评标委员会",
|
|||
|
"6.1.1": "评标由招标人依法组建的评标委员会负责。评标委员会由招标人或其委托的招标代理机构熟悉相关业务的代表,以及有关技术、经济等方面的专家组成。评标委员会成员人数以及技术、经济等方面专家的确定方式见投标人须知前附表。",
|
|||
|
"6.1.2": "评标委员会成员有下列情形之一的,应当回避:(1)投标人或投标人的主要负责人的近亲属;(2)项目主管部门或者行政监督部门的人员;(3)与投标人有经济利益关系或其他利害关系,可能影响对投标公正评审的;(4)曾因在招标、评标以及其他与招标投标有关活动中从事违法行为而受过行政处罚或刑事处罚的。",
|
|||
|
"6.2": "评标原则评标活动遵循公平、公正、科学和择优的原则。",
|
|||
|
"6.3": "评标评标委员会按照第三章"评标办法"规定的方法、评审因素、标准和程序对投标文件进行评审。第三章"评标办法"没有规定的方法、评审因素和标准,不作为评标依据。",
|
|||
|
"6.4": "评标结果(定标候选人)公示招标人将自收到评标报告之日起3日内,在投标人须知前附表规定的媒介公示定标候选人。公示期不少于3日。投标人或者其他利害关系人对评标结果有异议的,应当在评标结果公示期间提出。招标人自收到异议之日起3日内作出答复;作出答复前,暂停招标投标活动。异议与答复应当通过"电子交易系统"在"异议与答复"菜单以书面形式进行。",
|
|||
|
"6.5": "履约能力的审查(如有)如果定标候选人的经营、财务状况发生较大变化或者存在违法行为,招标人认为可能影响其履约能力的,将在发出中标通知书前,召集原评标委员会按照招标文件规定的标准和方法审查确认。"
|
|||
|
}'''
|
|||
|
|
|||
|
# 转换JSON并打印结果
|
|||
|
print(transform_json(input_json))
|