You need to enable JavaScript to run this app. 如何使用Python将CSV转换为前端CMS所需的多层嵌套JSON
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.08 01:45:04