为了账号安全,请及时绑定邮箱和手机立即绑定

在 GO 中将嵌套的 JSON 转换为 csv

在 GO 中将嵌套的 JSON 转换为 csv

Go
哔哔one 2022-01-04 21:12:49
我有一个示例 json,字段名称并不重要,但某些字段的嵌套值和数据类型很重要。我知道在 go 中,您必须确保在写入 csv 时,使用 csv.Writer 时数据是字符串数据类型。我的问题是,编写嵌套值的正确方法是什么,是否有一种有效的方法可以通过遍历整个 json 来转换所有非字符串值?`{  "name":"Name1",  "id": 2,  "jobs":{      "job1":"somejob",      "job2":"somejob2"   },  "prevIds":{      "id1": 100,      "id2": 102  }}`是例子json
查看完整描述

1 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

一个工作示例如下:


package main


import (

    "encoding/csv"

    "encoding/json"

    "fmt"

    "log"

    "os"

    "strconv"

)


func decodeJson(m map[string]interface{}) []string {

    values := make([]string, 0, len(m))

    for _, v := range m {

        switch vv := v.(type) {

        case map[string]interface{}:

            for _, value := range decodeJson(vv) {

                values = append(values, value)

            }

        case string:

            values = append(values, vv)

        case float64:

            values = append(values, strconv.FormatFloat(vv, 'f', -1, 64))

        case []interface{}:

            // Arrays aren't currently handled, since you haven't indicated that we should

            // and it's non-trivial to do so.

        case bool:

            values = append(values, strconv.FormatBool(vv))

        case nil:

            values = append(values, "nil")

        }

    }

    return values

}


func main() {

    var d interface{}

    err := json.Unmarshal(exampleJSON, &d)

    if err != nil {

        log.Fatal("Failed to unmarshal")

    }

    values := decodeJson(d.(map[string]interface{}))

    fmt.Println(values)


    f, err := os.Create("outputfile.csv")

    if err != nil {

        log.Fatal("Failed to create outputfile.csv")

    }

    defer f.Close()

    w := csv.NewWriter(f)

    if err := w.Write(values); err != nil {

        log.Fatal("Failed to write to file")

    }

    w.Flush()

    if err := w.Error(); err != nil {

        log.Fatal("Failed to flush outputfile.csv")

    }

}


var exampleJSON []byte = []byte(`{

  "name":"Name1",

  "id": 2,

  "jobs":{

      "job1":"somejob",

      "job2":"somejob2"

   },

  "prevIds":{

      "id1": 100,

      "id2": 102

  }

}`)

这是通过解码任意 JSON 来工作的,如这篇 goblog 文章所示,然后通过以通常的方式将其转换为字符串来迭代和处理每种可能的类型。如果您遇到map[string]interface{},那么您正在递归获取下一组数据。


一旦你有了一个[]string,你就可以把它传递给你csv.Writer自己写出来的任何你喜欢的。在这种情况下,输出是


Name1,2,somejob,somejob2,100,102



查看完整回答
反对 回复 2022-01-04
  • 1 回答
  • 0 关注
  • 228 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号