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的其他更多方法,使用場景大家可以更多地深入研究,歡迎留言探討