如何将嵌套JSON文件转换为无嵌套的扁平化单属性结构?
JSON嵌套结构扁平化实现方案
场景针对性实现
针对你提供的JSON结构,直接按层级提取字段即可,Python实现代码如下:
import json # 读取原始JSON文件 with open("input.json", "r", encoding="utf-8") as f: raw_data = json.load(f) flatten_result = [] for item in raw_data: # 提取顶层非嵌套基础字段 base_info = { "frame_id": item["frame_id"], "filename": item["filename"] } # 遍历objects数组,支持单帧对应多个检测目标的场景 for obj in item["objects"]: temp = base_info.copy() # 合并对象内除坐标外的一级字段 temp.update({k:v for k,v in obj.items() if k != "relative_coordinates"}) # 合并嵌套的坐标字段 temp.update(obj["relative_coordinates"]) flatten_result.append(temp) # 输出扁平化后的JSON文件 with open("output.json", "w", encoding="utf-8") as f: json.dump(flatten_result, f, indent=4, ensure_ascii=False)
运行后输出结果和你给出的JSON B格式完全一致,单帧存在多个检测目标时会自动拆分为多条独立的顶层记录,不会丢失数据。
通用嵌套JSON扁平化实现
如果需要处理结构不固定的任意嵌套JSON,可使用递归方法实现全层级打平,自动处理重名问题:
import json def flatten_json(nested_obj, parent_key='', sep='_'): items = [] if isinstance(nested_obj, dict): for k, v in nested_obj.items(): new_key = f"{parent_key}{sep}{k}" if parent_key else k if isinstance(v, (dict, list)): items.extend(flatten_json(v, new_key, sep=sep).items()) else: items.append((new_key, v)) elif isinstance(nested_obj, list): for i, v in enumerate(nested_obj): new_key = f"{parent_key}{sep}{i}" if parent_key else str(i) if isinstance(v, (dict, list)): items.extend(flatten_json(v, new_key, sep=sep).items()) else: items.append((new_key, v)) return dict(items) # 调用示例 with open("input.json", "r", encoding="utf-8") as f: raw_data = json.load(f) flatten_result = [flatten_json(item) for item in raw_data]
该实现支持任意层数的对象、数组嵌套,可通过修改sep参数自定义嵌套键的连接符,避免键名重复。
内容的提问来源于stack exchange,提问作者saniv
相关产品推荐
相关产品推荐

