如何从Python简单列表生成按ID分组的嵌套结构JSON文件
实现方案
核心思路是先做一步按id聚合的预处理,不要直接把每条原始数据传给json.dump。用Python字典作为中间容器,key设置为id值,天然实现相同id的内容归类,最后直接把整个字典序列化即可满足需求。
完整实现代码
import re import json # 读取原始文本,可替换为你自己的文件读取逻辑 with open("原始数据.txt", "r", encoding="utf-8") as f: raw_text = f.read() # 按id分割为单个数据块 block_pattern = re.compile(r'id: (\d+) [-]+') blocks = block_pattern.split(raw_text)[1:] # 定义需要归入addons的字段集合 addon_fields = {"balcone", "cantina", "terrazza", "giardino privato", "taverna", "esposizione esterna"} # 聚合用字典,key为id值 result = {} for i in range(0, len(blocks), 2): current_id = blocks[i] content_lines = [line.strip() for line in blocks[i+1].splitlines() if line.strip()] # 基础字段解析 item = { "city": content_lines[0], "zone": content_lines[1], "addons": {} } # 兼容不同格式的地址行 if content_lines[2].startswith("Via:"): item["via"] = content_lines[2].split(":", 1)[1].strip() item["link"] = content_lines[3] else: item["via"] = content_lines[2] item["zone"] = f"{item['zone']}, {content_lines[2]}" item["link"] = content_lines[3] # 解析剩余键值对字段 for line in content_lines[4:]: if ":" not in line: continue k, v = line.split(":", 1) k, v = k.strip(), v.strip() if k in addon_fields: item["addons"][k] = v else: item[k] = v # 同id聚合,需要合并字段可修改此处逻辑 if current_id not in result: result[current_id] = [] result[current_id].append(item) # 输出最终JSON with open("output.json", "w", encoding="utf-8") as f: json.dump(result, f, ensure_ascii=False, indent=2)
逻辑说明
- 正则分割避免了逐行处理的状态判断问题,每条id对应的数据块会被单独解析
- 聚合用的字典天然保证id唯一,300条原始数据如果只有5个不同id,最终输出的JSON顶层就只有5个键值对
- 如果相同id的多条数据需要合并字段而非追加到列表,只需修改聚合逻辑,把列表存储改为对象存储,重复字段按需求覆盖或合并即可
- 输出的JSON结构符合规范,修复了你示例中JSON语法错误的问题,也完全匹配你要的嵌套结构要求
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

