json是一种数据格式,经常被用作数据交换,页面展示,序列化等场景,基本每种语言都有对应的json解析框架,Go语言也不例外,并且内置了json库,基本能够满足一些普通开发场景,但有些复杂场景下就不太理想了,因此找一个好用的开源的json库就非常有必要了,先放地址

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

内置json库的使用

我们创建一个如下结构体,用来测试内置json库和开源的json库,一起看看使用上是来怎么操作的呢?

  1. //omitempty 这个属性可以在序列化时忽略0值和nil值
  2. // score 不能序列化,属于私有字段
  3. type Student struct {
  4. Id int `json:"id"` //如果想json后的id是字符串可以这样写 `json:"id,string"`
  5. Name string `json:"name"`
  6. Age int `json:"age"`
  7. score map[string]float32 `json:"score"`
  8. Phone string `json:"phone,omitempty"`
  9. Birthday JsonTime `json:"birthday"`
  10. }

内置的json库基本上就两个方法 ToJson和FromJson,把一个对象转换为json字符串,把json字符串转化为对象,如下两个api,如果我们想要从json字符串中获取某个key时,或者想要知道某个value的类型时,此时内置库就不支持了,我们就需要想别的办法了

  1. result, err := json.Marshal(v interface{})
  2. err := json.Unmarshal(jsonStr []byte, v interface{})
  3. //序列化
  4. func ToJson(v interface{}) (string, error) {
  5. result, err := json.Marshal(v)
  6. if err != nil {
  7. return "", nil
  8. }
  9. return string(result), nil
  10. }
  11. //反序列化
  12. func FromJson(jsonStr []byte, v interface{}) error {
  13. err := json.Unmarshal(jsonStr, v)
  14. if err != nil {
  15. log.Fatalln(err)
  16. return err
  17. }
  18. return nil
  19. }

simple-json的使用

这个框架使用起来非常简单,并且源码也非常简洁,只有三个源码文件,三个测试文件,感兴趣的同学可以研究下源码实现,simple-json是一个json解析库,就是说对json字符串进行解析,本身不支持序列化和反序列化

我们构造一个json字符串,然后使用simple-json根据我们的场景来解析这个字符串,得到我们想要的结果

  1. s := `{
  2. "tagA" : "json string",
  3. "tagB" : 1024,
  4. "tagD" : {
  5. "tagE":1000
  6. },
  7. "tagF":[
  8. "json array",
  9. 1024,
  10. {"tagH":"json object"}
  11. ]
  12. }`

首先我们获取一个json实例,框架本身支持多种方法获取一个json实力,可以直接创建,也可以在创建时直接指定一个json字符串,也可以通过文件的形式创建,这里我们使用使用第二种方式,也就是使用上面代码中的json2

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

1、第一个场景,获取key时tagA的值,下面代码中Get方法返回的还是Json实例,想要具体的值,得转换成值所对应得类型,假设我们已经知道这个值的类型,那么直接.String()就得到结果了

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

2、第二个场景, 获取数组中的key为tagH的值,首先获取tagF,返回Json实例,对应的是一个数组,获取下标为2的Json实例,再从这个Json实例中获取key为tagH的value

  1. j,err := json2.Get("tagF").GetIndex(2).Get("tagH").String()

3、第三个场景,检查某一个key是否存在,第一个反馈的值是json实例,第二个返回的值是bool类型,true代表存在,false代表不存在,如果存在我们可以通过json实例直接转换成值的类型

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

4、第四个场景,获取嵌套的key,simple-json提供了按照路径搜索的方法,也就是一层一层往下查找,每一层都是一个json实例,如下我们获取tagE

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

5、还有一个其他场景,比如删除一个key,获取key的时候返回默认值等

  1. //删除key是tagA值
  2. json2.Del("tagA")
  3. //获取key是tagC的值,如果不存在,一定返回一个默认的字符串,当然也可以返回默认的bool值,int值,等
  4. n := json2.Get("tagC").MustString("default")

simple-json的其他更多方法,使用场景大家可以更多地深入研究,欢迎留言探讨
GoLang公众号.jpg