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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:01:05