gjson常用方法 - go解析json
创始人
2024-05-24 12:51:35
0

简介

  • Github 地址
  • go 安装: go get -u github.com/tidwall/gjson

主要类型

Type

  • 说明

    说明: 解析的数据类型(实际是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

  • 说明

    说明: 用户存放解析的结果
    
  • 实现

    // 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
    }
    

方法

gjson

  • 验证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})
    

result

  • 基于类型的方法

    // 输出类型
    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
    })
    

Path

  • 获取长度(仅对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()
    

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...