LASS的json api有2層的json結構,網路搜尋到的json範例,多是只能抓取一層,能抓取第2層的例子,卻只能在第2層放內建的int與float之類的資料型態,因LASS第2層資料用golang的json讀取後會形成一個map的資料結構,所以須使用interface陣列才能進去讀取第2層。
num_of_records這個欄位, 轉換後的資料型態是float64, 可以直接印出來, 但如果要用於迴圈變數, 須轉成整數n=int(m["num_of_records"].(float64))
以下是程式碼。(保留網路上找來的parseArray()與parseMap(),以後可能會用到)
package main
import ( "encoding/json" "fmt" "io/ioutil" "net/http" )
func main() { resp, err := http.Get("https://data.lass-net.org/data/last-all-lass.json") jsonResponse, _ := ioutil.ReadAll(resp.Body)
var m map[string]interface{} if err := json.Unmarshal(jsonResponse, &m); err != nil { fmt.Println("Fatal") panic(err) }
if err != nil { fmt.Println("error: ", err) } else { //fmt.Println(m) fmt.Println("ver=", m["version"]) fmt.Println("src=", m["source"]) fmt.Println("num=", m["num_of_records"]) //fmt.Println("feeds=", m["feeds"].(map)) //how to extract records?? } //parseMap(m) //parseArray(m["feeds"].([]interface{})) //fmt.Println("feeds[0]=", m["feeds"].([]interface{})[0].(map[string]interface{})["gps_num"]) //for lassData := range m["feeds"].([]interface{}) { //n := m["num_of_records"].(type) switch m["num_of_records"].(type) { case string: fmt.Println("type is string") case int: fmt.Println("type is int") case float32: fmt.Println("type is float32") case float64: fmt.Println("type is float64") //===> this is the answer default: fmt.Println("type is unknown") }
n := int(m["num_of_records"].(float64)) //n, ok := m["num_of_records"].(int) //bad ? fmt.Println("n=", n)
for i, lassData := range m["feeds"].([]interface{}) { fmt.Println("------------ record # ", i, "------------") fmt.Print("device_id=", lassData.(map[string]interface{})["device_id"]) fmt.Print(", SiteName=", lassData.(map[string]interface{})["SiteName"]) fmt.Print(", gpsLat=", lassData.(map[string]interface{})["gpsLat"]) fmt.Print(", gpsLon=", lassData.(map[string]interface{})["gpsLon"]) fmt.Print(", timestamp=", lassData.(map[string]interface{})["timestamp"]) fmt.Print(", s_d0=", lassData.(map[string]interface{})["s_d0"]) fmt.Print(", s_d1=", lassData.(map[string]interface{})["s_d1"]) fmt.Print(", s_d2=", lassData.(map[string]interface{})["s_d2"]) fmt.Print(", s_h0", lassData.(map[string]interface{})["s_h0"]) fmt.Println(", s_h1=", lassData.(map[string]interface{})["s_h1"]) //fmt.Println("gps_num=", lassData.(map[string]interface{})["gps_num"]) } }
func parseMap(aMap map[string]interface{}) { for key, val := range aMap { switch concreteVal := val.(type) { case map[string]interface{}: fmt.Println("--- parseMap():map[string]interface{} --------") fmt.Println(key) parseMap(val.(map[string]interface{})) case []interface{}: fmt.Println("--- parseMap():[]interface{} --------") fmt.Println(key) parseArray(val.([]interface{})) default: fmt.Println("--- parseMap():default --------") fmt.Println(key, ":", concreteVal) } } }
func parseArray(anArray []interface{}) { for i, val := range anArray { switch concreteVal := val.(type) { case map[string]interface{}: fmt.Println("--- parseArray():map[string]interface{} --------") fmt.Println("Index:", i) parseMap(val.(map[string]interface{})) case []interface{}: fmt.Println("--- parseArray():[]interface{} --------") fmt.Println("Index:", i) parseArray(val.([]interface{})) default: fmt.Println("--- parseArray():default --------") fmt.Println("Index", i, ":", concreteVal)
} } } |
留言列表