Python嵌套列表转JSON:如何构建数据生成指定嵌套结构
在Python中构建嵌套JSON结构并转CSV的实用方案
嘿,我来帮你搞定这个嵌套JSON的构建问题!你已经能处理单层字典转JSON了,嵌套的其实原理一样——Python的dict对应JSON的对象,list对应JSON的数组,直接层层嵌套就行。下面给你一步步来:
一、先搞定嵌套JSON的构建
直接用Python的内置数据结构堆出你要的层级就行,举个和你示例匹配的完整代码:
import json # 从最内层开始构建,一步步往外包 # 最内层的name条目 name_item_1 = {"diesel": "yes", "fuel_type": "high-pressure"} name_item_2 = {"diesel": "no", "fuel_type": "regular"} # 然后是engine条目 engine_item = {"mod_a": "x1", "name": [name_item_1, name_item_2]} # 接着是car条目 car_item_1 = {"car": "brown", "color": "yellow", "engine": [engine_item]} car_item_2 = {"car": "silver", "color": "gray", "engine": [{"mod_a": "x2", "name": [{"diesel": "yes", "fuel_type": "medium"}]}]} # 最后组装成顶层结构 final_data = { "Prop_a": [car_item_1, car_item_2] } # 写入JSON文件,indent=4让格式更清晰 with open("nested_data.json", "w", encoding="utf-8") as f: json.dump(final_data, f, indent=4, ensure_ascii=False)
运行完你打开nested_data.json,就是你要的那种嵌套结构,完全符合Prop_a是数组、里面包含带engine数组的对象、engine里又有name数组的要求。
二、转CSV用于数据库导入
CSV是扁平结构,直接转嵌套JSON会丢数据,所以得先把嵌套结构扁平化——就是把嵌套的键用.或者[]连接成单层键,比如engine[0].mod_a。这里给你一个好用的递归扁平化函数:
import csv def flatten_nested(data, parent_key="", sep="."): flattened = {} for key, value in data.items(): # 拼接新的键名,比如parent_key是engine[0],key是mod_a,就变成engine[0].mod_a new_key = f"{parent_key}{sep}{key}" if parent_key else key if isinstance(value, dict): # 如果是字典,递归扁平化 flattened.update(flatten_nested(value, new_key, sep)) elif isinstance(value, list): # 如果是列表,给每个元素加索引标记,比如name[0]、name[1] for idx, item in enumerate(value): if isinstance(item, dict): flattened.update(flatten_nested(item, f"{new_key}[{idx}]", sep)) else: flattened[f"{new_key}[{idx}]"] = item else: # 普通值直接存 flattened[new_key] = value return flattened # 把Prop_a里的每个条目都扁平化 flattened_list = [flatten_nested(item) for item in final_data["Prop_a"]] # 写入CSV文件 if flattened_list: # 取第一个条目的键作为表头 headers = flattened_list[0].keys() with open("flat_data.csv", "w", newline="", encoding="utf-8") as f: writer = csv.DictWriter(f, fieldnames=headers) writer.writeheader() writer.writerows(flattened_list)
生成的CSV里,所有嵌套层级都会被展开成类似engine[0].mod_a、engine[0].name[0].diesel的列名,导入数据库的时候直接映射字段就行。
额外小建议
- 如果要批量生成大量嵌套数据,别手动写每个条目,用循环或者生成器批量构建就行,效率高多了。
- 有些数据库(比如PostgreSQL、MongoDB)直接支持导入JSON格式,不用转CSV,还能保留嵌套结构,适合后续做复杂查询,你可以根据自己的数据库类型选更合适的方式。
内容的提问来源于stack exchange,提问作者Shawn
相关产品推荐
相关产品推荐

