gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:29:41 29 4
gpt4 key购买 nike

我有一个 json 示例,字段名称并不重要,但某些字段的嵌套值和数据类型很重要。我知道在 go 中你必须确保当你写入 csv 时,当你使用 csv.Writer 时数据是字符串数据类型。我的问题是,编写嵌套值的正确方法是什么?是否有一种通过遍历整个 json 来转换所有非字符串值的有效方法?

`{
"name":"Name1",
"id": 2,
"jobs":{
"job1":"somejob",
"job2":"somejob2"
},
"prevIds":{
"id1": 100,
"id2": 102
}
}`

例子是json

最佳答案

下面是一个工作示例:

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 来实现,如 this goblog post 所示。然后通过以通常的方式将其转换为字符串来迭代和处理每种可能的类型。如果您遇到 map[string]interface{},那么您正在递归获取下一组数据。

获得[]string 后,您可以将其传递给您的csv.Writer 以按照您喜欢的方式写出。在这种情况下,输出是

Name1,2,somejob,somejob2,100,102

关于json - 在 GO 中将嵌套的 JSON 转换为 csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36752050/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com