前言,最近项目中需要动态解析json字符串,但是golang标准库提供的json需要事先定义好结构体,不太灵活,因此需要调研不依赖于结构体的json库
目前golang开源json库各自的优缺点
encoding/json, 官方自带的, 文档最多, 易用性差, 性能差
go-simplejson, gabs, jason等衍生包, 简单且易用, 易于阅读, 便于维护, 但性能最差
easyjson, ffjson此类包, 适合固定结构的json, 易用性一般, 维护成本高, 性能特别好
jsonparser 适合动态和固定结构的json, 简单且易用, 维护成本低, 性能极好
以性能的高低排序: jsonparser > easyjson > encoding/json > go-simplejson, gabs, jason
性能测试, 可见jsonparser的github
buger/jsonparser
golang simplejson使用笔记
介绍:
golang标准库的json需要预先定义好结构体,然后才能将json字符串转化为golang的结构体;simplejson这个开源的库可以在不知道json字符串具体结构的情况下进行编码和解码
使用:
import (
simplejson "github.com/bitly/go-simplejson"
)
func case1() {
//初始化*simpleJson.Json对象
sj, err := simplejson.NewJson([]byte(jsonStr))
var v *simpleJson.Json
//获取字段,如果有多级,可以层层嵌套获取
v = sj.Get(字段名1).Get(字段名2)
//将v的值转化为具体类型的值,MustXXX方法一定可以转化成功
//若转化不成功,则转化为该类型的零值
result := v.MustString()
}
func case2() {
//检查某个字段是否存在
_, ok := js.Get("字段名1").CheckGet("字段名2")
if ok {
fmt.Println("存在!")
} else {
fmt.Println("不存在")
}
}
总结:
虽然simplejson可以转化一个未知的json,但想要获取到具体的值,仍然需要知道它的类型,