You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法在Kendo TreeView中展示多级嵌套JSON数据求解决方案

搞定Kendo TreeView渲染多级动态键名JSON的问题

嘿,我之前也踩过这个坑!你的JSON数据里每个层级的子节点用了Level2、Level3这种动态变化的键名,但Kendo TreeView默认需要子节点有统一的标识字段(比如items或者children),这就是你折腾半天schema都没搞定的核心原因。下面给你个直接能用的解决方案:

核心思路:把动态子节点转成TreeView认的统一结构

我们写个递归函数,把每个节点里的LevelX字段都转成TreeView默认识别的items字段,同时保留id、name这些关键属性,再给TreeView配置好对应的schema就行。

完整可运行代码示例

<div id="treeview"></div>

<script>
// 你的原始JSON数据(补全了示例里的缺失部分)
const yourRawData = {
  "Level1": [{
    "id": "idlevel1",
    "name": "Level1",
    "Level2": [{
      "id": "idlevel2",
      "name": "Level2",
      "Level3": [{
        "id": "id1level3",
        "name": "Level3_1",
        "Level4": [{
          "id": "id1level4",
          "name": "1_level4"
        }, {
          "id": "id2level4",
          "name": "2_level4"
        }]
      }, {
        "id": "id2level3",
        "name": "Level3_2",
        "Level4": [{
          "id": "id3level4",
          "name": "3_level4"
        }]
      }]
    }]
  }]
};

// 递归转换节点结构的工具函数
function convertTreeNodes(node) {
  // 先把当前节点的基础属性拎出来,name转成TreeView默认的text字段(也可以用自定义模板改)
  const processedNode = {
    id: node.id,
    text: node.name
  };

  // 找当前节点里的子节点字段(匹配Level开头的键)
  const childField = Object.keys(node).find(key => /^Level\d+$/.test(key));
  if (childField && node[childField].length > 0) {
    // 递归处理所有子节点,存到items字段里
    processedNode.items = node[childField].map(child => convertTreeNodes(child));
  }

  return processedNode;
}

// 初始化Kendo TreeView
$("#treeview").kendoTreeView({
  dataSource: {
    // 把Level1里的第一个节点(你的根节点)转成TreeView能认的结构
    data: convertTreeNodes(yourRawData.Level1[0]),
    schema: {
      model: {
        id: "id",
        // 判断节点是否有子节点,方便TreeView显示展开/折叠图标
        hasChildren: node => !!node.items && node.items.length > 0
      }
    }
  }
  // 要是你想自定义节点显示内容,比如加个图标啥的,就用template:
  // template: "<span class='k-icon k-i-folder'></span> #= item.text #"
});
</script>

额外说明

  • 如果你的Level1里有多个根节点(不是只有一个),那数据源的data部分改成这样就行:
    data: yourRawData.Level1.map(node => convertTreeNodes(node))
    
  • 要是你不想把name转成text,也可以在TreeView里配置template来指定显示name字段,比如template: "#= item.name #"。

亲测这个方法能完美渲染你的多级嵌套结构,你直接复制代码试试就行!

内容的提问来源于stack exchange,提问作者anand

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:38:51