文章目录

  • 简介
  • 主要类型
    • Type
    • Result
  • 方法
    • gjson
    • result
  • Path
  • 修饰符
    • 示例
    • 介绍
    • 自定义
  • 备用

简介

  • 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()
    

gjson - Golang 解析 JSON相关推荐

  1. go 发送http请求; Golang 解析JSON 篇

    https://www.runoob.com/go/go-fmt-sprintf.html go 发送http请求: package mainimport ("io/ioutil" ...

  2. Golang 处理 Json(二):解码

    golang 编码 json 还比较简单,而解析 json 则非常蛋疼.不像 PHP 一句 json_decode() 就能搞定.之前项目开发中,为了兼容不同客户端的需求,请求的 content-ty ...

  3. go json的key为数字怎么解析_golang向interface{}解析json时把所有的数字都当成float64...

    最近发现 golang解析json时把所有的int,float,double等数字,向interface{}解析时都当成float64(当然被双信号包围的数字除外,任何被双引号包围的,都是字符串.), ...

  4. 细说Golang的JSON解析

    之前一直写一些动态语言,觉得解析JOSN还是很简单的,往往只需要几行代码就能拿到解析好的JSON对象.Go语言自带的json包可以让你在程序中方便的读取和写入 JSON 数据.生成JSON场景相对简单 ...

  5. golang 递归方式解析json串

    golang 递归方式解析json串 package mainimport ("fmt""encoding/json" )func jsonArrayParse ...

  6. 问题解决:Golang的json包解析字段失败

    引言 这个问题出现在解析一个json的配置文件时,排错了很久,最后和狗勋一起解决了这个奇怪的问题. 正文 其实这个问题并不难,因为Golang自带json包,所以我们要做的其实就是在需要解析的结构体中 ...

  7. 在Go语言程序中使用gojson来解析JSON格式文件

    gojson是快速解析json数据的一个golang包,你使用它可以快速的查找json内的数据 安装 1 go get github.com/widuu/gojson 使用简介 结构 type Js ...

  8. Go语言解析Json(使用jsonparser)

    原文地址:https://blog.csdn.net/benben_2015/article/details/81119804 jsonparser  github地址:https://github. ...

  9. golang中json.Number妙用

    golang中json.Number妙用 最近跟某斯调试一个API接口,接口返回数据是json格式 ,按文档描述是一个整型数据,于是定义如下 type Data struct {Api int `js ...

最新文章

  1. python函数速查_Python语法速查: 7. 函数基础
  2. 波卡链Substrate (7)Grandpa + Babe
  3. Spark _23 _读取parquet文件创建DataFrame(二)
  4. Geek爱旅行 - 穿越时间的旅行
  5. 一加7充电_一加真无线耳机曝光,65W快速充电器获认证
  6. 小程序绘图工具painter-json文件绘制保存分享图-可点击任意元素触发函数
  7. a byte of python图书购买_A Byte of Python
  8. 大数据学习笔记43:Hive - JDBC编程
  9. batchplot 3.6.2 插件_插件分享 | 可在线查询子域名和同IP域名的RapidDNS
  10. 如何免费申请js.org二级域名
  11. 小米pro蓝牙驱动linux,【小米笔记本蓝牙驱动下载】小米笔记本蓝牙驱动程序官方下载 V20.11 通用版-七喜软件园...
  12. 2020年个人所得税计算方法(附带计算器)
  13. eclipse导入项目jsp页面报错完美解决
  14. php邮箱发送,PHP的邮箱发送
  15. VS 2017产品密匙
  16. 网络Socket编程
  17. 有些朋友没看清楚,我在这里再特意强调一下
  18. 常见的Eclipse排版设置
  19. 解决联想ideapad 110如何进入bios界面修改禁用状态的VT选项问题
  20. 如何拷贝VCD里面加密隐藏的文件

热门文章

  1. 优思学院|六西格玛黑带考试难不难?
  2. 如何评价掘金量化的质量?
  3. Java简单实现本地缓存
  4. 卷积神经网络算法python实现_卷积神经网络概述及python实现-阿里云开发者社区...
  5. Lepus(天兔)数据库监控系统
  6. iCMS的article.admincp.php和content.admincp.php模块存在SQL注入
  7. 云网融合与算力网络系列文章
  8. MFC中Listbox控件的简单使用
  9. 解决微信小程序 输入框获取焦点光标偏移
  10. 华山独臂挑夫3000余次登顶养家 拒绝乞讨