2017-07-07 27 views
2

我想解析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?

回答

1

由於您試圖將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