請教Golang處理Json, 處理的是 List of Json這種情況,大家有何高見?

bonfy發表於2017-08-02

現在 Restful API 好多,有時候想要抓取些資訊,整理成自己有用的,比如說 Github 的 release, 但是有些返回的不是 Json 而是 List of Json.對於這種情況,當然 Python 的 Json 庫是通吃的,一點問題都沒有,我用 Golang 重寫就麻煩大了

比如舉個例子:

[
    {
        "one-level": "hello",
        "two-level": {
            "aa" : "hello",
            "bb" : "world"
        }
    },
    {
        "one-level": "你好",
        "two-level": {
            "aa" : "你好",
            "bb" : "世界"
        }
    }
]

由於:

resp, err := http.Get(url)
body, err := ioutil.ReadAll(resp.Body)

最後得到的 body 是 [] byte,我現在用 simplejson 簡單的處理是這麼做的:

package main

import "github.com/bitly/go-simplejson"
import "fmt"

func main() {
    bytes := []byte(`{"hello":"world"}`)
    js, _ := simplejson.NewJson(bytes)
    fmt.Println(js)

    fmt.Println(js.Get("hello").MustString())

    bytes2 := []byte(`[
    {
        "one-level": "hello",
        "two-level": {
            "aa" : "hello",
            "bb" : "world"
        }
    },
    {
        "one-level": "你好",
        "two-level": {
            "aa" : "你好",
            "bb" : "世界"
        }
    }
]`)
    js2, _ := simplejson.NewJson(bytes2)
    fmt.Println(js2.MustArray())

    arr := js2.MustArray()
    for _, item := range arr {
        m, ok := item.(map[string]interface{})
        if !ok {
            fmt.Println("Invalide data")
        }

        fmt.Println(m["one-level"])

        n, ok := m["two-level"].(map[string]interface{})
        if !ok {
            fmt.Println("Invalid data")
        }
        fmt.Println(n["bb"])
    }
}

simplejson 對於純 Json 的處理還是蠻方便的,但是對於這種 list of json 的,感覺處理的不夠優雅,各位大神有沒有處理的經驗,大家一般是怎麼去處理這樣的問題的?特別是層數比較多的情況

更多原創文章乾貨分享,請關注公眾號
  • 請教Golang處理Json, 處理的是 List of Json這種情況,大家有何高見?
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章