json - 如何将 JSON 文件保存到 csv 中

标签 json csv go

我正在尝试将此 astros.json 文件保存到 csv 文件中。

一切正常我没有任何错误,但我的代码没有进入我的for环形。

所以 astros.csv 文件创建成功,但里面没有数据。

package main

import (
    "encoding/json"
    "encoding/csv"
    "fmt"
    "io/ioutil"
    "os"
    "net/http"
    "strconv"
)

type People struct {
    Name string
    Craft string
}

type General struct {
    //People []People
    Number int
    Message string
}

func main() {
    // Reading data from JSON File  
    response, err := http.Get("http://api.open-notify.org/astros.json")
    if err != nil {
        fmt.Printf("The Http request failed with error %s\n", err)
    }

    data,_ := ioutil.ReadAll(response.Body)
    //fmt.Println(string(data))
    // Unmarshal JSON data
    var general []General
    json.Unmarshal([]byte(data), &general)
    //fmt.Printf("First person: %s, Message: %s", general.People[0].Name, general.Message)

    // Create a csv file
    csvdatafile, err := os.Create("./astros.csv")
    if err != nil {
        fmt.Println(err)
    }
    defer csvdatafile.Close()
    // Write Unmarshaled json data to CSV file
    w := csv.NewWriter(csvdatafile)
    for _, obj := range general {   
        fmt.Println("Are you going into the for ?")
        var record []string
        //record = append(record, obj.People)
        record = append(record, strconv.Itoa(obj.Number), obj.Message)
        record = append(record, obj.Message)
        //record = append(record, []string{People})
        w.Write(record)
        fmt.Println("Are you coming here")
        record = nil
    }
    w.Flush()
    fmt.Println("Appending succed")

}

最佳答案

始终检查错误很重要;如果您将代码更改为:

err = json.Unmarshal([]byte(data), &general)
if err != nil {
   fmt.Printf("Error in unmarshall %s\n", err)
   return
}

然后你会看到问题; json.Unmarshal正在返回 cannot unmarshal object into Go value of type []main.General .这意味着 general是 nil 所以你的循环永远不会进入。

当您比较 JSON 时,原因很明显:
{
    "people": [{
            "name": "Christina Koch",
            "craft": "ISS"
        }, {
            "name": "Alexander Skvortsov",
            "craft": "ISS"
        }, {
            "name": "Luca Parmitano",
            "craft": "ISS"
        }, {
            "name": "Andrew Morgan",
            "craft": "ISS"
        }, {
            "name": "Oleg Skripochka",
            "craft": "ISS"
        }, {
            "name": "Jessica Meir",
            "craft": "ISS"
        }
    ],
    "number": 6,
    "message": "success"
}

使用您要解码的变量; []General在哪里 General是:
type General struct {
    //People []People
    Number int
    Message string
}

看起来您在某些时候对 []People 有正确的想法但随后将其注释掉。

如果您取消注释 []People , 解码为 General (而不是 []General )然后制作你的循环 for _, obj := range general.People {它应该按预期工作。这假设您要遍历人员; general.Message 和 general.Number 也可用(但您不需要循环来访问这些)。

this example (已删除文件操作,因为操场不支持)。

关于json - 如何将 JSON 文件保存到 csv 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59996152/

相关文章:

javascript - 函数读取不传递给变量的 JSON 数据

javascript - Youtube 数据 API 视频嵌入限制

php - 我如何使用 php 从 sql 查询创建一个 csv 文件

csv - pgadmin 4 导入/导出表不起作用

go error % 不允许

go - 如何将多个数据传递给 Go 模板?

php - json_decode 到自定义类

c++ - 如何使用 boost::json::value 调用无参数函数

javascript - 如何从 html 表单中获取输入值并转换为 csv?

function - Golang MVC结构