gpt4 book ai didi

go - Go语言解析Json报错

转载 作者:IT王子 更新时间:2023-10-29 01:44:42 27 4
gpt4 key购买 nike

我正在尝试解析 Json 并打印数据并使用 GO 语言保存在 CSV 中。

它使用 Println 每页打印所需的 10 个结果,但无法解析 JSON。

这就是我做的

  1. 访客访问 studentresults.com/page=1 RollNo.显示 10 个学生的 & 分数,它也保存在 CSV 文件中 [key.rollno & key.marks]

  2. 程序向 studentsapimarks.com/api/rollno1,rollno2,rollno3/detail 发出请求(附加我们在步骤 1 中获得的所有 key.rollno)Json 响应就像

    [{"name":"James","Percentage":96.5,"Remarks":"VeryGood"}, 
    {"name":"William","Percentage":36.0,"Remarks":"Bad"},
    {"name":"Jacob","Percentage":63.0,"Remarks":"Average"},
    {"name":"Wilson","Percentage":69.3,"Remarks":"Average"},
    {"name":"Kurtson","Percentage":16.9,"Remarks":"VeryBad"},
    {"name":"Tom","Percentage":86.3,"Remarks":"Good"}]
  3. 提取名称和百分比字段并保存在 csv 中

这是我负责打印和保存结果的代码片段

package main

import (
"encoding/csv"
"fmt"
"net/http"
"os"
"strings"
"encoding/json"

)


type Key struct {
fname string
marks int
rollno int
}

type object struct {
Percentage float64
Name string `json:"name"`
}


func PageRequest(w http.ResponseWriter, r *http.Request) {


// Page header
fmt.Fprintf(w, PageHeader, pages, previous, next)

// Save in csv
csvfile, err := os.OpenFile("marks.csv", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
fmt.Println("Error:", err)
return
}
defer csvfile.Close()

writer := csv.NewWriter(csvfile)
defer writer.Flush()

// Defining RollNos
var rollNos []string

// Marks for UID
UID, length := compute(start)
for i := 0; i < length; i++ {
key := UID[i]

// Prints firstname, Marks and Rollno
fmt.Fprintf(w, key.fname, key.marks, key.rollno)



records := [][]string{{key.fname, key.marks, key.rollno}}

for _, record := range records {
err := writer.Write(record)
if err != nil {
fmt.Println("Error:", err)
return
}
}

// Append All key.rollno
rollNos := append(rollNos, key.rollno)

// Makes a request to as studentsapimarks.com/api/rollno1,rollno2,rollno3/detail
uri := "https://studentsapimarks.com/api/" + strings.Join(rollNos, ",") + "/detail"

res, err := http.Get(uri)
if err != nil {
log.Fatal(err)
}
defer res.Body.Close()

var s []object
err = json.NewDecoder(res.Body).Decode(&s)
if err != nil {
log.Fatal(err)
}

// Prints Name/ Percentage
fmt.Println(s[0].Name)
fmt.Println(s[0].Percentage)
}

// Page Footer
fmt.Fprintf(w, PageFooter, previous, next)
}


func main() {
http.HandleFunc("/", PageRequest)

log.Println("Listening")
log.Fatal(http.ListenAndServe(":8080", nil))

}

fmt.Fprintf(w, key.fname, key.marks, key.rollno) 工作正常,每页显示所有 10 个结果并保存在 csv 中。

代码有问题

  1. 它没有将我们在第 1 步中获得的所有 key.rollno 附加为 studentsapimarks.com/api/rollno1,rollno2,rollno3/detail

  2. 另外,如何将提取的 JSON s[0].name 结果保存为 CSV?

最佳答案

JSON 解析失败,因为您正在尝试将 JSON 数组解码为结构。您想要将 JSON 数组解码为一个 slice - 外部结构不是必需的:

var s []object
err = json.NewDecoder(res.Body).Decode(&s)

此外,它只能解码导出字段(以大写字母开头的字段),因此要获取名称,您需要更改结构定义。我猜百分比也没有通过,因为在 JSON 中它是单个浮点值,但在您的结构中您使用的是浮点 slice 。

type object struct {
// "Percentage": 96.4 is not a slice.
// Also if the field name in Go and JSON are identical, you dont need the json tag.
Percentage float64
// The field must be capitalized, the tag can stay lowercase
Name string `json:"name"`
}

然后您将相应地访问这些字段:

// Prints Name/ Percentage
fmt.Println(s[0].Name)
fmt.Println(s[0].Percentage)

关于go - Go语言解析Json报错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44974200/

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