使用Go语言解析Json时出错

问题描述:

我想解析Json &使用GO语言打印数据并保存为CSV。使用Go语言解析Json时出错

这是每页打印所需的10个结果与Println但无法解析JSON。

这是我在做什么

  1. 访问者访问studentresults.com/page=1 RollNo。显示&标记为10名学生,它也保存在一个CSV [key.rollno & key.marks]

  2. 程序使studentsapimarks.com/api/rollno1,rollno2,rollno3/detail请求(附加所有key.rollno我们在步骤1中得到) 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. 它不附加所有key.rollno我们在步骤1中得到的studentsapimarks.com/api/rollno1,rollno2,rollno3/detail

  2. 而且我怎么能保存JSON提取s[0].name导致CSV?

由于您试图将JSON数组解析为结构,因此JSON解析失败。要解组一个JSON数组切片 - 外部结构是没有必要的:

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

而且,它只能解组导出的字段(那些以大写字母开头),因此要获得名称,就将需要改变你的结构定义。我猜这个百分比也没有通过,因为在JSON中它是一个单一的浮点值,但是在你的结构中,你需要一个浮点数。

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) 
+0

删除'类型的对象struct'&'型ObjectsAPIResponse struct'和使用'变种S []现在object'收到错误'未定义:对象' – Nancyme

+0

这是因为你删除了对象类型。我给你一个更新的定义 - 不要删除它,使用更新的定义。 – Adrian

+0

现在错误's.Allmarks undefined(type [] object has no field or method Allmarks)' – Nancyme