如何将包含键值映射的循环数据列表转换为指定嵌套JSON结构
实现方案与原理说明
前置逻辑:字段映射规则
首先根据你提供的样例数据和目标结构,先明确每个id对应16组键值对的分层规则:
- 顶层字段(共6个):
id、city、zone、via、link、prezzo - 附加字段(共10个):
tipologia、m2、piano、p_edificio、balcone、cantina、terrazza、giardino privato、taverna、esposizione esterna,全部放入addons数组的首个对象中
代码实现(Python)
你已经拿到规整的键值对数组,可直接使用以下逻辑处理:
import json # 你的原始规整数组,每个元素是单id对应的16组键值对列表 raw_data = [ [("id", "0"), ("city", "Roma"), ("zone", "Via Francesco Saverio Altamura"), ("via", "0"), ("link", "https://www.immobiliare.it/annunci/p-147276/"), ("tipologia", "Appartamento"), ("m2", "113 m²"), ("piano", "1°, con ascensore"), ("p_edificio", "4 piani"), ("prezzo", "€ 158.000 - € 270.000"), ("balcone", "0"), ("cantina", "0"), ("terrazza", "0"), ("giardino privato", "0"), ("taverna", "0"), ("esposizione esterna", "0")], # 更多id的键值对在此处补充 ] # 顶层字段白名单 top_fields = {"id", "city", "zone", "via", "link", "prezzo"} output_list = [] for item_group in raw_data: temp_dict = dict(item_group) # 初始化结构化对象 structured = { "id": temp_dict["id"], "city": temp_dict["city"], "zone": temp_dict["zone"], "via": temp_dict["via"], "link": temp_dict["link"], "prezzo": temp_dict["prezzo"], "addons": [{}] } # 填充附加字段到addons for key, value in temp_dict.items(): if key not in top_fields: structured["addons"][0][key] = value output_list.append(structured) # 导出为嵌套JSON文件 with open("structured_property.json", "w", encoding="utf-8") as f: json.dump(output_list, f, ensure_ascii=False, indent=2)
如果你的原始数据还只是纯行列表,没有拆成键值对,可以先执行前置拆分逻辑:
# 读取原始行数据,过滤空行 with open("raw_data.txt", "r", encoding="utf-8") as f: lines = [line.strip() for line in f if line.strip()] # 按16行一组拆分,每组对应一个id的完整数据 groups = [lines[i:i+16] for i in range(0, len(lines), 16)] raw_data = [] for group in groups: kv_list = [] for idx, line in enumerate(group): if idx == 0: k, v = line.split(":", 1) kv_list.append((k.strip(), v.strip())) elif idx == 1: kv_list.append(("city", line)) elif idx == 2: kv_list.append(("zone", line)) elif idx == 3: _, v = line.split(":", 1) kv_list.append(("via", v.strip())) elif idx == 4: kv_list.append(("link", line)) else: k, v = line.split(":", 1) kv_list.append((k.strip(), v.strip())) raw_data.append(kv_list)
实现原理说明
- 字段分层逻辑:将高频查询的公共属性放到顶层,低频的附加属性统一收拢到
addons数组,既符合你要求的嵌套结构,也方便后续扩展单个id对应多组附加属性的场景 - 临时字典中转:把有序键值对转成字典后直接按键名取值,不需要硬编码字段位置,后续字段顺序调整时只需要修改映射规则即可,维护成本更低
- 标准化JSON导出:使用语言内置的JSON库序列化,自动处理语法格式、转义、缩进等问题,避免手动拼接字符串出现的语法错误
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

