猿问

Golang多维切片成预期的输出字符串json

在我的 Go 代码中,我有字符串的多维切片


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"},

}

如何转换为 json 以便生成的打印输出符合预期。也许递归


{

    "data": [

      {

        "name": "foods",

        "data": [

          {

            "name": "food by cooking technique",

            "data": [

              { "name": "baked food" },

              { "name": "baked beans" }

            ]

          },

          {

            "name": "food by type",

            "data": [

              { "name": "dried food" }

            ]

          }

        ]

      },

      {

        "name": "drinks",

        "data": [

          {

            "name": "hot drinks",

            "data": [

              { "name": "tea" },

              { "name": "herbal tea" }

            ]

          },

          {

            "name": "cold drinks",

            "data": [

              { "name": "ice cream drinks" }

            ]

          }

        ]

      }

    ]

}

还没有想出这方面的想法,感谢您的帮助


Cats萌萌
浏览 125回答 1
1回答

芜湖不芜

速度不快,但可以理解的方法:package mainimport (    "encoding/json"    "log")type mapStruct struct {    Data map[string]*mapStruct}type dataStruct struct {    Name string        `json:"name,omitempty"`    Data []*dataStruct `json:"data,omitempty"`}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"},    }    data := &mapStruct{}    for _, v := range input {        temp := data        for _, vv := range v {            if temp.Data == nil {                temp.Data = map[string]*mapStruct{}            }            if _, ok := temp.Data[vv]; !ok {                temp.Data[vv] = &mapStruct{}            }            temp = temp.Data[vv]        }    }    output := &dataStruct{}    fun(output, data)    bts, err := json.MarshalIndent(output, "", "\t")    if err != nil {        log.Println(err)        return    }    log.Println(string(bts))}func fun(d *dataStruct, m *mapStruct) {    for k, v := range m.Data {        d.Data = append(d.Data, &dataStruct{})        d.Data[len(d.Data)-1].Name = k        fun(d.Data[len(d.Data)-1], v)    }}
随时随地看视频慕课网APP

相关分类

Go
我要回答