Golang如何将多维字符串切片转换为指定嵌套结构JSON
实现方法
可以用递归实现,逻辑非常简洁,且支持任意深度的路径转换,不需要针对固定层级写硬编码逻辑。
- 首先定义统一的节点结构,每一层的节点格式完全一致,天然适合递归处理:
import ( "encoding/json" "fmt" ) type TreeNode struct { Name string `json:"name"` Data []*TreeNode `json:"data,omitempty"` // 最末级节点无下级时,不会序列化空data字段 }
- 实现递归插入逻辑:对每一条路径,从根层级开始逐段匹配节点,不存在则新建,再深入下一层级处理剩余路径段,直到整条路径处理完成:
// 将路径从指定索引位置开始,插入到当前层级的节点列表中 func addPath(nodes *[]*TreeNode, path []string, idx int) { // 路径处理完毕,递归终止 if idx >= len(path) { return } currentSeg := path[idx] // 查找当前层级是否已存在同名节点 var matched *TreeNode for _, n := range *nodes { if n.Name == currentSeg { matched = n break } } // 不存在则新建节点加入当前层级 if matched == nil { matched = &TreeNode{Name: currentSeg} *nodes = append(*nodes, matched) } // 递归处理下一级路径 addPath(&matched.Data, path, idx+1) }
- 主逻辑遍历所有输入路径,构建完整树结构后序列化为JSON即可:
func main() { input := [][]string{ {"foods", "food by cooking technique", "baked food"}, {"foods", "food by cooking technique", "baked beans"}, {"foods", "food by type", "dried food"}, {"drinks", "hot drinks", "tea"}, {"drinks", "hot drinks", "herbal tea"}, {"drinks", "cold drinks", "ice cream drinks"}, } root := make([]*TreeNode, 0) for _, p := range input { addPath(&root, p, 0) } output := map[string]any{"data": root} // 带格式化缩进输出JSON res, _ := json.MarshalIndent(output, "", " ") fmt.Println(string(res)) }
运行上述代码输出的结果和你给出的预期JSON完全一致。
说明:递归实现没有层级限制,哪怕后续你的路径长度增加到4层、5层,代码不需要任何修改就能正常工作。如果偏好非递归实现,也可以用循环替换递归逻辑,逐段遍历路径维护当前节点指针即可,但递归写法的可读性和通用性更好。
内容的提问来源于stack exchange,提问作者Anz
相关产品推荐
相关产品推荐

