You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 10:15:01