如何使用Python将CSV转换为前端CMS所需的多层嵌套JSON
CSV 转换为CMS所需嵌套JSON的实现方案
原方案问题根源
基于dpath.util实现的逻辑出现唯一键堆叠,本质是结构适配不匹配:
- dpath的路径解析逻辑天然生成对象键值对的嵌套结构,和目标要求的「每一层为带type标识的数组、同类型元素按序排列」的结构完全不兼容
- 路径拆分后把每段值作为唯一键,多个同层级同类型内容会被生成独立键名存储,既无数组组织逻辑,也无法匹配前端按type分流渲染的组件规则
可落地实现逻辑
因为允许调整REFERENCE列格式适配解析逻辑,可以利用原REFERENCE的类型#序号结构特性,跳过dpath的键值对解析,直接按数组定位逐层构建嵌套结构,核心规则为:
- 保留REFERENCE的
节点类型#层级序号->子节点类型#子层级序号格式,每一段拆为(节点类型, 同层级序号)两个参数 - 从顶层数组开始,逐层按序号定位数组索引位置,不存在对应索引位置时,按节点类型初始化目标结构
- 遍历到路径最后一层时,把当前行的TEXT、other data内容填充到对应节点的字段上
核心实现代码
import pandas as pd def csv_to_cms_structure(df): # 最终返回的顶层数组 cms_root = [] # 节点类型对应的默认结构模板,完全匹配前端要求的字段 node_schema = { "SECTION": lambda: {"type": "SECTION", "subtitle": None, "title": "", "content": [], "config": {}}, "P": lambda: {"type": "P", "text": "", "config": {}}, "SUBSECTION": lambda: {"type": "SUBSECTION", "title": "", "content": [], "config": {}} } for _, row in df.iterrows(): # 拆分REFERENCE为层级列表,每段为(节点类型, 层级内序号) ref_segments = row["REFERENCE"].split("->") path_layers = [] for seg in ref_segments: node_type, seq_str = seg.split("#") path_layers.append( (node_type, int(seq_str)) ) # 从顶层根数组开始逐层定位 current_array = cms_root for layer_idx, (node_type, seq) in enumerate(path_layers): # 数组长度不够对应序号时,初始化新节点补到对应位置 if seq >= len(current_array): new_node = node_schema[node_type]() current_array.insert(seq, new_node) current_node = current_array[seq] # 到达路径最后一层,填充业务字段 if layer_idx == len(path_layers) - 1: if node_type == "P": current_node["text"] = row["TEXT"] current_node["config"] = {"extra-info": row["other data"]} if row["other data"] else {} else: current_node["title"] = row["TEXT"] else: # 非最后一层,把指针移到当前节点的content子数组 current_array = current_node["content"] return cms_root
适配说明
- 完全不需要修改原有TEXT列的内容,只需要保证REFERENCE列的序号连续、类型标记正确即可
- 同层级下的多个同类型节点,通过序号自动排序组成content数组,从根源避免了键值堆叠、内容覆盖的问题
- 新增节点类型时,只需要在
node_schema字典里补充对应类型的默认模板,不需要修改核心遍历逻辑 - 如需扩展subtitle等字段,只需要在REFERENCE路径里增加对应层级段,在模板里补充分支填充规则即可
示例:当REFERENCE列写为
SECTION#0->P#0、SECTION#0->P#1、SECTION#0->SUBSECTION#2时,会自动在SECTION节点的content数组里按顺序生成两个P节点、一个SUBSECTION节点,和前端要求的渲染结构完全一致
内容的提问来源于stack exchange,提问作者toughyear
相关产品推荐
相关产品推荐

