脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - Go 语言 json解析框架与 gjson 详解

Go 语言 json解析框架与 gjson 详解

2022-07-31 14:24树獭叔叔 Golang

这篇文章主要介绍了Go语言json解析框架与gjson,JSON 解析是我们不可避免的常见问题,在Go语言中,我们可以借助gjson库来方便的进行json属性的提取与解析,需要的朋友可以参考一下

前言:

JSON 解析是我们不可避免的常见问题,在 Go 语言中,我们可以借助 gjson 库来方便的进行 json 属性的提取与解析,本文和大家一起上手与梳理 gjson 库的使用。

1. 快速使用

快速安装:

?
1
go get github.com/tidwall/gjson

Get() 方法解析 json 字符串:

?
1
2
3
json := `{"name":{"first":"uncle","last":"suta"}}`
lastName := gjson.Get(json, "name.last")
fmt.Println(lastName.String()) // "uncle"

通过上面的例子,我们可以看到,使用 gjson 中的 Get() 方法,我们可以轻松愉快的进行 json 解析。

2. Get() 返回的 Result 结构体

Get() 方法在解析完 json 字符串后,返回的是一个 Result 结构体,其结构如下所示:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Result represents a json value that is returned from Get().
type Result struct {
   // Type is the json type
   Type Type
   // Raw is the raw json
   Raw string
   // Str is the json string
   Str string
   // Num is the json number
   Num float64
   // Index of raw value in original json, zero means index unknown
   Index int
   // Indexes of all the elements that match on a path containing the '#'
   // query character.
   Indexes []int
}

但是,我们解析 json 所需要的往往是基本数据类型,因此,Result 结构体本身为我们实现了如下所示的丰富的方法来进行类型转化:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
String() string
Bool() bool
Int() int64
Uint() uint64
Float() float64
Time() time.Time
Array() []Result
IsObject() bool
IsArray() bool
ForEach(iterator func(key Result, value Result) bool)
Map() map[string]Result
Get(path string) Result
arrayOrMap(vc byte, valueize bool) (r arrayOrMapResult)
Exists() bool
Value() interface{}
Less(token Result, caseSensitive bool) bool
Paths(json string) []string
Path(json string) string

3. 键路径

在 gjson 中,键路径实际上是以.分隔的一系列键。

gjson支持在键中包含通配符*?*匹配任意多个字符,?匹配单个字符。 例如abc*可以匹配abc1111/abc222/abc...等以abc开头的键,ab?只能匹配ab1/ab2等以ab开头且后面只有一个字符的键。

数组使用键名 + . + 索引(索引从 0 开始)的方式读取元素,如果键a对应的值是一个数组,那么a.0读取数组的第一个元素,a.1读取第二个元素。

数组长度使用键名 + . + #获取,例如a.#返回数组a的长度。

如果键名中出现.,那么需要使用\进行转义。

4. json 数组遍历

gjson还提供了通用的遍历数组和对象的方式。gjson.Get()方法返回一个gjson.Result类型的对象,json.Result提供了ForEach()方法用于遍历。该方法接受一个类型为func (key, value gjson.Result) bool的回调函数。遍历对象时keyvalue分别为对象的键和值;遍历数组时,value为数组元素,key为空(不是索引)。回调返回false时,遍历停止:

?
1
2
3
4
5
6
json := `{"list": ["a", "b", "c"]}`
list := gjson.Get(json, "list")
list.ForEach(func(_, element gjson.Result) bool {
  fmt.Println(element)
  return true
})

5. 其他

gjson.Valid() 可以对 json 字符串的合法性进行校验。

gjson.GetMany() 可以一次解析多个字段。

到此这篇关于Go 语言 json解析框架与 gjson 详解的文章就介绍到这了,更多相关Go json 内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/7119019344549380132

延伸 · 阅读

精彩推荐
  • GolangGolang通脉之方法详情

    Golang通脉之方法详情

    这篇文章主要介绍了Golang通脉方法,Go语言中的方法(Method)是一种作用于特定类型变量的函数。这种特定类型变量叫做接收者(Receiver)。接收者的概念就...

    8352021-11-24
  • Golanggolang 限制同一时间的并发量操作

    golang 限制同一时间的并发量操作

    这篇文章主要介绍了golang 限制同一时间的并发量操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    小辣抓9262021-02-25
  • GolangGolang中如何使用lua进行扩展详解

    Golang中如何使用lua进行扩展详解

    这篇文章主要给大家介绍了关于Golang中如何使用lua进行扩展的相关资料,这是最近在工作中遇到的一个问题,觉着有必要分享出来给大家学习,文中给出了...

    pinecone5372020-05-09
  • GolangGo语言结构体定义和使用方法

    Go语言结构体定义和使用方法

    这篇文章主要介绍了Go语言结构体定义和使用方法,以实例形式分析了Go语言中结构体的定义和使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下 ...

    脚本之家8442020-04-16
  • GolangGo语言range关键字循环时的坑

    Go语言range关键字循环时的坑

    今天小编就为大家分享一篇关于Go语言range关键字循环时的坑,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来...

    benben_20154202020-05-23
  • GolangGin与Mysql实现简单Restful风格API实战示例详解

    Gin与Mysql实现简单Restful风格API实战示例详解

    这篇文章主要为大家介绍了Gin与Mysql实现简单Restful风格API示例详解,有需要的朋友可以借鉴参考下希望能够有所帮助,祝大家多多进步...

    秋天的春13402021-12-05
  • Golang使用Golang简单实现七牛图片处理API

    使用Golang简单实现七牛图片处理API

    本文给大家实现的是使用Golang简单实现七牛图片处理API的方法和步骤,基于PIPE库实现的,非常的实用,有需要的小伙伴可以参考下 ...

    一堆好人卡5702020-05-01
  • GolangGo语言基础之结构体(秋日篇)

    Go语言基础之结构体(秋日篇)

    本篇我们学习Go基础之结构体的匿名字段结构体,结构体嵌套,匿名结构体嵌套,匿名嵌套结构体字段冲突。...

    Go语言进阶学习4722020-11-30