如何将 JSON 文件保存到 csv 中

我正在尝试将此 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")


}

犯罪嫌疑人X
浏览 211回答 2
2回答

潇湘沐

始终检查错误很重要;如果您将代码更改为: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}看起来您在某些时候对 the 有正确的想法,[]People但随后将其注释掉。如果你取消注释[]People,解组为General(而不是[]General)然后让你的循环for _, obj := range general.People {它应该按预期工作。这假设您要遍历人员;general.Message 和 general.Number 也可用(但您不需要循环来访问这些)。

斯蒂芬大帝

你可以尝试这样的事情:package mainimport (    "encoding/csv"    "encoding/json"    "fmt"    "net/http"    "os"    "strconv")type People struct {    Name  string    Craft string}type Response struct {    People  []People    Number  int    Message string}func main() {    // Reading data from JSON File    r, err := http.Get("http://api.open-notify.org/astros.json")    if err != nil {        fmt.Printf("The Http request failed with error %s\n", err)    }    var response Response    err = json.NewDecoder(r.Body).Decode(&response)    if err != nil {        fmt.Printf("decoding error%s\n", err)        return    }    // 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 response.People {        fmt.Println("Are you going into the for ?")        var record []string        //record = append(record, obj.People)        record = append(record, strconv.Itoa(response.Number), response.Message)        record = append(record, obj.Name)        // record = append(record, []string{obj})        w.Write(record)        fmt.Println("Are you coming here")        record = nil    }    w.Flush()    fmt.Println("Appending succed")}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go