go get -u github.com/tidwall/gjson
说明
说明: 解析的数据类型(实际是int类型)
功能: 用于解析和输出时做判断
包括:
- True
- False
- String
- JSON
- Number
- Null
功能: 只有一个String()方法, 返回对应类型的字符串(如JSON类型返回"JSON", 未定义的类型返回"")
实现
// Type is Result type
type Type intconst (// Null is a null json valueNull Type = iota// False is a json false booleanFalse// Number is json numberNumber// String is a json stringString// True is a json true booleanTrue// JSON is a raw block of JSONJSON
)
说明
说明: 用户存放解析的结果
实现
// Result represents a json value that is returned from Get().
type Result struct {// Type is the json typeType Type// Raw is the raw jsonRaw string// Str is the json stringStr string// Num is the json numberNum float64// Index of raw value in original json, zero means index unknownIndex int// Indexes of all the elements that match on a path containing the '#'// query character.Indexes []int
}
验证JSON是否合法, 返回bool
data1 := `{"data": {"msg": "test"}}`
data2 := []byte(`{"data": {"msg": "test"}}`)// 参数类型为string
gjson.Valid(data1)// 参数类型为[]byte
gjson.ValidBytes(data2)
解析完整JSON串, 返回Result
// 参数类型为string
gjson.Parse(data1)// 参数类型为[]byte
gjson.ParseBytes(data2)
解析JSON串的指定path, 返回Result
// 参数类型为string
gjson.Get(data1, "data")// 参数类型为[]byte
gjson.GetBytes(data2, "data")
解析JSON串的多个指定path, 返回[]Result
// 参数类型为string
gjson.GetMany(data1, "data", "data.msg")// 参数类型为[]byte
gjson.GetManyBytes(data2, "data", "data.msg")
修饰符
// ModifierExists 验证修饰符方法是否存在
// 实际只有第一个参数有意义, 参数func可以直接传空
gjson.ModifierExists("pretty", nil)// AddModifier 添加修饰符方法
gjson.AddModifier("yky", func(json, arg string) string {return "123"
})
逐行处理
data3 := `{"data": {"msg": "test1"}}
{"data": {"msg": "test2"}}
{"data": {"msg": "test3"}}`gjson.ForEachLine(data3, func(line gjson.Result) bool {// 处理代码段, 可以在外边单独定义fmt.Println("data.msg")return true})
基于类型的方法
// 输出类型
gjson.Get(data, "data").Type.String// 返回json原始结果(即key冒号后边的所有内容)
// "k":[1,2,3] --> [1,2,3]
// "k":"\"abc\"" --> "\"abc\""
gjson.Get(data, "data").Raw// String类型返回字符串, 不是返回""
gjson.Get(data, "data").Str// 数字类型返回int64, 不是返回0
gjson.Get(data, "data").Num
获取对应类型结果
// 返回对应类型
gjson.Get(data, "data").Int()
gjson.Get(data, "data").Uint()
gjson.Get(data, "data").Float()
gjson.Get(data, "data").String()
gjson.Get(data, "data").Bool()
gjson.Get(data, "data").Time()// --> map[string]Result
gjson.Get(data, "data").Map()
// --> []Result
gjson.Get(data, "data").Array()
// --> interface{}
gjson.Get(data, "data").Value()
获取判断结果, 返回bool
// result.type == JSON && len(result.raw) > 0 && result.raw[0] == "{"
gjson.Get(data1, "data").IsObject()// result.type == JSON && len(result.raw) > 0 && result.raw[0] == "["
gjson.Get(data1, "data").IsArray()// result.type == True || result.type == False
gjson.Get(data1, "data").IsBool()// result.Type != Null || len(result.Raw) != 0
gjson.Get(data1, "data").Exists()
继续查询
gjson.Get(data1, "data").Get("key")
遍历查询
gjson.Get(data, "data").ForEach(func(key, value gjson.Result) bool {// 当data取出的是array时, key为index// 当data取出的是map时, key为key// 根据处理结果返回boolreturn true
})
获取长度(仅对array生效)
data := `{"k": [1, 2, 3]}`
gjson.Get(data, "k.#").Int()
遍历array
data := `{"k":[{"foo":11},{"foo":2},{"foo":3}]}`
gjson.Get(data, "k.#.foo").Int()
根据索引取值
data := `{"k":[{"foo":11},{"foo":2},{"foo":3}]}`
gjson.Get(data, "k.1.foo").Int()
模糊匹配(只返回第一个找到的结果)
data := `{"aa":100, "a22a":200, "a333a":300}`// * 匹配0~n个任意字符
gjson.Get(data, "a*a").Int()// ? 匹配1个任意字符
gjson.Get(data, "a?a").Int()
条件判断
data := `{"data": [{"lesson": "english", "score": 10},{"lesson": "math", "score": 90},{"lesson": "chinese", "score": 100},
]}`// #... 返回匹配的第一个结果
gjson.Get(data, "data.#(score>20).lesson")// #...# 返回匹配的所有结果
gjson.Get(data, "data.#(score>20).lesson")// 支持判断条件, ==, !=, <, <=, >,>=, %(like) 和 !%(not like)
gjson.Get(data, `data.#(lesson%"*e*")#.score`)
多层条件判断
data := `{"data": [{"lesson":"math", "score": [100, 100, 100]},{"lesson":"chinese", "score": [60, 30, 90]},{"lesson":"english", "score": [80, 40, 100]}
]}`// 查询score小于60的lesson
gjson.Get(data, "data.#(score.#(<60))#.lesson")// path推导过程
// data.#()#.lesson --> 由于最后要输出lesson的内容,所以最外层格式是这样的
// data.#(score.#())#.lesson --> 内层需要获取score中的值做判断, (需求是有小于60的分数就返回, 所以是#...)
// data.#(socre.#(<60))#.lesson --> 判断条件为小于60,而且格式为array,所以不需要写keyName, 直接写(<60)即可
data := `{"data": [1, [2, [3, 4]] ]}`// gjson 调用需要带path
gjson.Get(data, `data|@flatten:{"deep":true}|@reverse`)// result 调用直接指定修饰符和参数即可
gjson.Get(data, `data`).Get(`@flatten:{"deep":true}|@reverse`)// 先修饰后取值(array填索引, map填key)
gjson.Get(data, `data`).Get(`@flatten:{"deep":true}|@reverse|0`)
// 具体修饰功能的参数可以进源码查看var modifiers = map[string]func(json, arg string) string{"pretty": modPretty, // 增加缩进"ugly": modUgly, // 去掉所有空格"reverse": modReverse, // 反序array"this": modThis, // 返回当前(不做处理)"flatten": modFlatten, // 展开array(只展开一层), {"deep":true} --> 全部展开"join": modJoin, // 合并[{},{}]的每对kv"valid": modValid, // 判断是否合法, 合法返回json, 不合法返回"""keys": modKeys, // 返回map的所有key"values": modValues, // 返回map的所有value"tostr": modToStr, // 转raw字符串"fromstr": modFromStr, // 转普通字符串"group": modGroup,
}
gjson.AddModifier
类反序列化处理
data := []byte(`{"name":"Aki", "age":25, "num":"1231231234", "score": {"english": 100, "math": 99}}`)
rs := gjson.GetManyBytes(data, "name", "age", "num", "score")
score := map[string]int64{"english": rs[3].Get("english").Int(),"math": rs[3].Get("math").Int(),
}
stu1 := Stu{Name: rs[0].String(),Age: rs[1].Int(),Num: rs[2].String(),Score: score,
}
没搞明白的
gjson.AppendJSONString(data2, data1)gjson.Get(data, "data").Path()
gjson.Get(data, "data").Paths()gjson.Get(data, "data").Less()
上一篇:第一个驱动程序