一、目录
二、简介
1. 为什么要使用gjson?
golang初学者肯定会觉得Json的解析十分麻烦。其实是要转换思维,我们不能像PHP或JS一样把Json直接转化为对象。
所以我们定义一系列的函数去获取Json里面的值。 gjson(github.com/tidwall/gjson) 很好的支持了各种Json操作。使用它可以方便地解析Json,并进行判断、取值。2. Result结构体
// 首先定义一个Result结构体,它是所有数据的抽象type Result struct { Type Type // 该结构体在Json中的类型 Raw string // 原json串 Str string // 字符串 Num float64 // 浮点数 Index int // 索引 }复制代码
3. 属于Result的函数
func (t Result) Exists() bool // 判断某值是否存在func (t Result) Value() interface{} // func (t Result) Int() int64func (t Result) Uint() uint64func (t Result) Float() float64func (t Result) String() stringfunc (t Result) Bool() boolfunc (t Result) Time() time.Timefunc (t Result) Array() []gjson.Resultfunc (t Result) Map() map[string]gjson.Resultfunc (t Result) Get(path string) Resultfunc (t Result) ForEach(iterator func(key, value Result) bool) // 可传闭包函数func (t Result) Less(token Result, caseSensitive bool) bool复制代码
4. 初始化函数
gjson.Parse(json).Get("name").Get("last")gjson.Get(json, "name").Get("last")gjson.Get(json, "name.last")复制代码
5. 判断Json是否合法
if !gjson.Valid(json) { return errors.New("invalid json")}复制代码
三、实际操作
1. 使用
package mainimport ( "fmt" "log" "strings" "github.com/tidwall/gjson")const json = `{"name":{"first":"Tom","last":"Anderson"},"age":37,"children":["Sara","Alex","Jack"],"fav.movie":"Deer Hunter","friends":[{"first":"Dale","last":"Murphy","age":44},{"first":"Roger","last":"Craig","age":68},{"first":"Jane","last":"Murphy","age":47}]}`func main() { // 首先我们判断该json是否合法 if !gjson.Valid(json) { log.Fatalf("%s", "invalid json") } // 获取Json中的age age := gjson.Get(json, `age`).Int() fmt.Printf("%T, %+v\n", age, age) // 获取lastname lastname := gjson.Get(json, `name.last`).String() fmt.Printf("%T, %+v\n", lastname, lastname) // 获取children数组 for _, v := range gjson.Get(json, `children`).Array() { fmt.Printf("%q ", v.String()) } fmt.Println() // 获取第二个孩子 fmt.Printf("%q\n", gjson.Get(json, `children.1`).String()) fmt.Printf("%q\n", gjson.Get(json, `children|1`).String()) // 通配符获取第三个孩子 fmt.Printf("%q\n", gjson.Get(json, `child*.2`).String()) // 反转数组函数 fmt.Printf("%q\n", gjson.Get(json, `children|@reverse`).Array()) // 自定义函数 - 全转大写 gjson.AddModifier("case", func(json, arg string) string { if arg == "upper" { return strings.ToUpper(json) } return json }) fmt.Printf("%+v\n", gjson.Get(json, `children|@case:upper`).Array()) // 直接解析为map jsonMap := gjson.Parse(json).Map() fmt.Printf("%+v\n", jsonMap) for _, v := range jsonMap { fmt.Printf("%T, %+v\n", v, v) }}复制代码