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

Go语言如何将字符串路径切片转换为适配Devextreme FileManager的层级JSON结构

实现思路

核心是先把所有路径按层级拆分,再逐层构建目录树结构:

  1. 定义符合前端要求的节点结构体,支持JSON序列化
  2. 遍历每一条路径,按/分割得到层级片段,过滤空片段
  3. 从根节点开始逐段匹配:前面的片段都按目录处理,最后一段按文件处理
  4. 匹配过程中如果没有找到对应目录就新建,避免重复创建同层级同名目录
完整实现代码
package main

import (
	"encoding/json"
	"fmt"
	"strings"
)

// FileNode 适配Devextreme FileManager的节点结构
type FileNode struct {
	Name        string     `json:"name"`
	IsDirectory bool       `json:"isDirectory"`
	Items       []FileNode `json:"items,omitempty"` // 文件节点不会输出items字段
}

func main() {
	sliceStr := []string{
		"/file_A.txt",
		"/folder_B/file_B.txt",
		"/folder_C/sub_folder_C/file_C.txt",
		"/folder_C/sub_folder_C/file_C_2.txt",
	}

	// 初始化根节点列表
	var root []FileNode

	for _, path := range sliceStr {
		// 分割路径,过滤空字符串(处理开头的/)
		parts := filterEmpty(strings.Split(path, "/"))
		if len(parts) == 0 {
			continue
		}

		currentLevel := &root
		// 处理前n-1段,都是目录
		for i := 0; i < len(parts)-1; i++ {
			dirName := parts[i]
			// 找当前层级有没有同名目录
			dirIdx := findDirIndex(*currentLevel, dirName)
			if dirIdx == -1 {
				// 没找到就新建目录
				newDir := FileNode{
					Name:        dirName,
					IsDirectory: true,
					Items:       []FileNode{},
				}
				*currentLevel = append(*currentLevel, newDir)
				dirIdx = len(*currentLevel) - 1
			}
			// 进入下一层级
			currentLevel = &(*currentLevel)[dirIdx].Items
		}

		// 处理最后一段,是文件
		fileName := parts[len(parts)-1]
		*currentLevel = append(*currentLevel, FileNode{
			Name:        fileName,
			IsDirectory: false,
		})
	}

	// 序列化为JSON,带缩进方便查看
	jsonBytes, err := json.MarshalIndent(root, "", "    ")
	if err != nil {
		panic(err)
	}
	fmt.Println(string(jsonBytes))
}

// filterEmpty 过滤字符串切片里的空元素
func filterEmpty(s []string) []string {
	var res []string
	for _, str := range s {
		if str != "" {
			res = append(res, str)
		}
	}
	return res
}

// findDirIndex 查找当前层级下有没有同名目录,返回下标,没找到返回-1
func findDirIndex(nodes []FileNode, dirName string) int {
	for idx, node := range nodes {
		if node.IsDirectory && node.Name == dirName {
			return idx
		}
	}
	return -1
}
运行效果

代码运行后输出的JSON结构和你要求的目标格式完全一致,可以直接返回给前端使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 08:21:02