處理回傳的JSON格式資料

我們常常會透過網際網路與別的API溝通,取回的資料有時候會遇到json格式,這時候就必須要進行相關處理。

透過 client 取得資料

res, err := http.Get("https://www.citibikenyc.com/stations/json")
if err != nil {
    panic(err.Error())
}

// 讀取回傳資料
body, err := ioutil.ReadAll(res.Body)
if err != nil {
    panic(err.Error())
}

針對回傳資料定義struct

type Station struct {
    Id int64 `json:"id"`
    StationName string `json:"stationName"`
    AvailableDocks int64 `json:"availableDocks"`
    TotalDocks int64 `json:"totalDocks"`
    Latitude float64 `json:"latitude"`
    Longitude float64 `json:"longitude"`
    StatusValue string `json:"statusValue"`
    StatusKey int64 `json:"statusKey"`
    AvailableBikes int64 `json:"availableBikes"`
    StAddress1 string `json:"stAddress1"`
    StAddress2 string `json:"stAddress2"`
    City string `json:"city"`
    PostalCode string `json:"postalCode"`
    Location string `json:"location"`
    Altitude string `json:"altitude"`
    TestStation bool `json:"testStation"`
    LastCommunicationTime string `json:"lastCommunicationTime"`
    LandMark string `json:"landMark"`
}

type StationAPIResponse struct {
    ExecutionTime string `json:"executionTime"`
    StationBeanList []Station `json:"stationBeanList"`
}

有了結構後,就可以自訂函數來作轉換

func getStations(body []byte) (*StationAPIResponse, error) {
    var s = new(StationAPIResponse)
    err := json.Unmarshal(body, &s)
    if(err != nil){
        fmt.Println("whoops:", err)
    }
    return s, err
}
  • 完整程式碼
package main

import (
 ......
)

func getStations(body []byte) (*StationAPIResponse, error) {
    var s = new(StationAPIResponse)
    err := json.Unmarshal(body, &s)
    if(err != nil){
        fmt.Println("whoops:", err)
    }
    return s, err
}

func main() {

    res, err := http.Get("https://www.citibikenyc.com/stations/json")
    if err != nil {
        panic(err.Error())
    }

    body, err := ioutil.ReadAll(res.Body)
    if err != nil {
        panic(err.Error())
    }

    s, err := getStations([]byte(body))
   // 若是陣列,可以使用下列方式取得值
   for i := range s {
      fmt.Printf("%v", s[i].ID)
   }
}

參考資料