json是一种数据格式,常常被用做数据交换,页面展现,序列化等场景,基本每种语言都有对应的json解析框架,Go语言也不例外,而且内置了json库,基本可以知足一些普通开发场景,但有些复杂场景下就不太理想了,所以找一个好用的开源的json库就很是有必要了,先放地址git
https://github.com/bitly/go-simplejson
咱们建立一个以下结构体,用来测试内置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是一个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的其余更多方法,使用场景你们能够更多地深刻研究,欢迎留言探讨开发