golang初学者确定会以为Json的解析十分麻烦。实际上是要转换思惟,咱们不能像PHP或JS同样把Json直接转化为对象。
因此咱们定义一系列的函数去获取Json里面的值。
gjson(github.com/tidwall/gjson) 很好的支持了各类Json操做。使用它能够方便地解析Json,并进行判断、取值。git
// 首先定义一个Result结构体,它是全部数据的抽象
type Result struct {
Type Type // 该结构体在Json中的类型
Raw string // 原json串
Str string // 字符串
Num float64 // 浮点数
Index int // 索引
}
复制代码
func (t Result) Exists() bool // 判断某值是否存在 func (t Result) Value() interface{} //
func (t Result) Int() int64 func (t Result) Uint() uint64 func (t Result) Float() float64 func (t Result) String() string func (t Result) Bool() bool func (t Result) Time() time.Time func (t Result) Array() []gjson.Result func (t Result) Map() map[string]gjson.Result func (t Result) Get(path string) Result func (t Result) ForEach(iterator func(key, value Result) bool) // 可传闭包函数 func (t Result) Less(token Result, caseSensitive bool) bool 复制代码
gjson.Parse(json).Get("name").Get("last")
gjson.Get(json, "name").Get("last")
gjson.Get(json, "name.last")
复制代码
if !gjson.Valid(json) {
return errors.New("invalid json")
}
复制代码
package main
import (
"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)
}
}
复制代码