一個很是棒的Go-Json解析庫

json是一種數據格式,常常被用做數據交換,頁面展現,序列化等場景,基本每種語言都有對應的json解析框架,Go語言也不例外,而且內置了json庫,基本可以知足一些普通開發場景,但有些複雜場景下就不太理想了,所以找一個好用的開源的json庫就很是有必要了,先放地址git

https://github.com/bitly/go-simplejson

內置json庫的使用

咱們建立一個以下結構體,用來測試內置json庫和開源的json庫,一塊兒看看使用上是來怎麼操做的呢?github

//omitempty  這個屬性能夠在序列化時忽略0值和nil值
// score 不能序列化,屬於私有字段
type Student struct {
    Id       int                `json:"id"` //若是想json後的id是字符串能夠這樣寫  `json:"id,string"`
    Name     string             `json:"name"`
    Age      int                `json:"age"`
    score    map[string]float32 `json:"score"`
    Phone    string             `json:"phone,omitempty"`
    Birthday JsonTime           `json:"birthday"`
}

內置的json庫基本上就兩個方法 ToJson和FromJson,把一個對象轉換爲json字符串,把json字符串轉化爲對象,以下兩個api,若是咱們想要從json字符串中獲取某個key時,或者想要知道某個value的類型時,此時內置庫就不支持了,咱們就須要想別的辦法了json

result, err := json.Marshal(v interface{})
err := json.Unmarshal(jsonStr []byte, v interface{})
//序列化
func ToJson(v interface{}) (string, error) {
    result, err := json.Marshal(v)
    if err != nil {
        return "", nil
    }
    return string(result), nil
}
//反序列化
func FromJson(jsonStr []byte, v interface{}) error {
    err := json.Unmarshal(jsonStr, v)
    if err != nil {
        log.Fatalln(err)
        return err
    }
    return nil
}

simple-json的使用

這個框架使用起來很是簡單,而且源碼也很是簡潔,只有三個源碼文件,三個測試文件,感興趣的同窗能夠研究下源碼實現,simple-json是一個json解析庫,就是說對json字符串進行解析,自己不支持序列化和反序列化
咱們構造一個json字符串,而後使用simple-json根據咱們的場景來解析這個字符串,獲得咱們想要的結果api

s := `{
        "tagA" : "json string",
        "tagB" : 1024,
        "tagD" : {
            "tagE":1000
        },
        "tagF":[
            "json array",
            1024,
            {"tagH":"json object"}
        ]
}`

首先咱們獲取一個json實例,框架自己支持多種方法獲取一個json實力,能夠直接建立,也能夠在建立時直接指定一個json字符串,也能夠經過文件的形式建立,這裏咱們使用使用第二種方式,也就是使用上面代碼中的json2數組

json1 := simplejson.New()
json2 := simplejson.NewJson(bs [] byte)
json3 := simplejson.NewFromReader(r io.Reader)

一、第一個場景,獲取key時tagA的值,下面代碼中Get方法返回的仍是Json實例,想要具體的值,得轉換成值所對應得類型,假設咱們已經知道這個值的類型,那麼直接.String()就獲得結果了框架

tagAValue ,err := json2.Get("tagA").String()

二、第二個場景, 獲取數組中的key爲tagH的值,首先獲取tagF,返回Json實例,對應的是一個數組,獲取下標爲2的Json實例,再從這個Json實例中獲取key爲tagH的value
j,err := json2.Get("tagF").GetIndex(2).Get("tagH").String()
三、第三個場景,檢查某一個key是否存在,第一個反饋的值是json實例,第二個返回的值是bool類型,true表明存在,false表明不存在,若是存在咱們能夠經過json實例直接轉換成值的類型測試

if json, ok := json2.CheckGet("tagD"); ok { //true ,有該字段
    result,_ := json.String()
    fmt.Println(ok, result)
}

四、第四個場景,獲取嵌套的key,simple-json提供了按照路徑搜索的方法,也就是一層一層往下查找,每一層都是一個json實例,以下咱們獲取tagEcode

k, err := json2.GetPath("tagD", "tagE").Int64()

五、還有一個其餘場景,好比刪除一個key,獲取key的時候返回默認值等對象

//刪除key是tagA值
json2.Del("tagA")
//獲取key是tagC的值,若是不存在,必定返回一個默認的字符串,固然也能夠返回默認的bool值,int值,等
n := json2.Get("tagC").MustString("default")

simple-json的其餘更多方法,使用場景你們能夠更多地深刻研究,歡迎留言探討開發

相關文章
相關標籤/搜索