Go语言如何将字符串路径切片转换为适配Devextreme FileManager的层级JSON结构
实现思路
核心是先把所有路径按层级拆分,再逐层构建目录树结构:
- 定义符合前端要求的节点结构体,支持JSON序列化
- 遍历每一条路径,按
/分割得到层级片段,过滤空片段 - 从根节点开始逐段匹配:前面的片段都按目录处理,最后一段按文件处理
- 匹配过程中如果没有找到对应目录就新建,避免重复创建同层级同名目录
完整实现代码
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
相关产品推荐
相关产品推荐

