文章目录
GO中gjson
的应用和分享
咱们上次分享到使用 GO 爬取静态网页的数据,一起来回顾一下
- 分享静态网页和动态网页的简要说明
- GO 爬取静态网页简单数据
- GO 爬取网页上的图片
- 并发爬取网页上的资源
要是对 GO 爬取静态数据还有点兴趣的话,欢迎查看文章 分享一波 GO 的爬虫
json
是什么?
JSON
(JavaScript Object Notation,JS
对象简谱) 是一种轻量级的数据交换格式它基于 ECMAScript (欧洲计算机协会制定的
JS
规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据
json
有如下几个优势:
- 层次结构简洁清晰
- 易于阅读和编写
- 易于机器解析和生成
- 能够提升网络传输效率
简单列一下咱们常用的数据序列化的方式
- json
- xml
是可扩展标记语言,是一种简单的数据存储语言
- protobuf
是一种平台无关、语言无关、可扩展且轻便高效的序列化数据结构的协议,可以用于 网络通信 和 数据存储
gjson
是什么?
是 GO 里面的一个库
它主要是提供了一种非常快速且简单的方式从json
文档中获取相应值
这个 gjson
库,实际上是 get + json
的缩写,无独有偶,同样的也有sjson
库,小伙伴们就知道他代表的含义了吧,是 set + json
的意思
gjson
如何使用?
对于 gjson
如何使用,XDM,我这里把这个库的基本使用,涉及到的知识点,以及注意事项,给大家梳理梳理
要是想看看 gjson
的源码是如何实现高效快速的操作json
的,感兴趣的朋友,可以在先会引用的基础上再去详细查看一下源码
本文的分享,围绕如下 4 个方面来实操和梳理 gjson
的使用:
gjson
的简单使用gjson
的json
行gjson
的 修饰符 和 自定义修饰符gjson
键路径的匹配规则
gjson
的简单使用
咱们简单使用一个gjson
,如下编码涉及如下几个点:
- 设置具体的
json
数据 - **校验
json
数据 **是否合法 - 一次性获取单个值
- 一次性获取多个值
package main
import (
"log"
"github.com/tidwall/gjson"
)
func main() {
// 设置参数,打印行数
log.SetFlags(log.Lshortfile | log.LstdFlags)
// 设置 json 数据
json := `
{
"author": {
"name": "xiaomotong",
"age": 18,
"hobby": "writing"
},
"extra": "hello wolrd"
"picList":[{"name":"xiaozhu1"},{"name":"xiaozhu2"}]
}
`
// 校验 json 字符串是否合法
// 如果不合法的话, gjson 不会报错 panic,可能会拿到一个奇怪值
if gjson.Valid(json){
log.Println("json valid ...")
}else{
log.Fatal("json invalid ... ")
}
// 获取 author.name 的 值
aName := gjson.Get(json, "author.name")
log.Println("aName :", aName.String())
// 获取 extra 的值
extra := gjson.Get(json, "extra")
log.Println("extra:", extra)
// 获取 一个不存在的 键 对应的 值
non := gjson.Get(json, "non")
log.Println("non:", non)
// 一次性 获取json 的多个键 值
res := gjson.GetMany(json, "author.age", "author.hobby","picList")
for i, v := range res{
if i == 0{
log.Println(v.Int())
}else if i == 2{
for _,vv := range v.Array(){
log.Println("picList.name :",vv.Get("name"))
}
}else{
log.Println(v)
}
}
}
运行上述代码后,可以看到如下效果:
2021/06/xx xx:32:04 main.go:28: json valid ...
2021/06/xx xx:32:04 main.go:35: aName : xiaomotong
2021/06/xx xx:32:04 main.go:39: extra: hello wolrd
2021/06/xx xx:32:04 main.go:43: non:
2021/06/xx xx:32:04 main.go:50: 18
2021/06/xx xx:32:04 main.go:57: writing
2021/06/xx xx:32:04 main.go:53: picList.name : xiaozhu1
2021/06/xx xx:32:04 main.go:53: picList.name : xiaozhu2
我们需要注意,要把我们的数据源弄对,也就是咱们的json
数据必须是合法的,否则,使用gjson
库拿到的数据就不会是咱们期望的值
- 使用
gjson.Get()
,获取单个值 - 使用
gjson.GetMany()
,获取多个值 - 使用
gjson.Valid()
,判断json
数据是否有效
gjson
的 json
行
再来看看 json 行
gjson
提供如下语法,来解析json 行
数据:
- …#
输出 json
行数组的