一個非常棒的Go-Json解析庫

json是一種數據格式,經常被用作數據交換,頁面展示,序列化等場景,基本每種語言都有對應的json解析框架,Go語言也不例外,並且內置了json庫,基本能夠滿足一些普通開發場景,但有些複雜場景下就不太理想了,因此找一個好用的開源的json庫就非常有必要了,先放地址

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

內置json庫的使用

我們創建一個如下結構體,用來測試內置json庫和開源的json庫,一起看看使用上是來怎麼操作的呢?

//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的類型時,此時內置庫就不支持了,我們就需要想別的辦法了

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根據我們的場景來解析這個字符串,得到我們想要的結果

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)

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

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

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

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

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

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

5、還有一個其他場景,比如刪除一個key,獲取key的時候返回默認值等

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

simple-json的其他更多方法,使用場景大家可以更多地深入研究,歡迎留言探討

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章