博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
go语言Json解析实用工具 - gjson
阅读量:6417 次
发布时间:2019-06-23

本文共 2513 字,大约阅读时间需要 8 分钟。

一、目录

二、简介

1. 为什么要使用gjson?

golang初学者肯定会觉得Json的解析十分麻烦。其实是要转换思维,我们不能像PHP或JS一样把Json直接转化为对象。

所以我们定义一系列的函数去获取Json里面的值。
gjson(github.com/tidwall/gjson) 很好的支持了各种Json操作。使用它可以方便地解析Json,并进行判断、取值。

2. Result结构体

// 首先定义一个Result结构体,它是所有数据的抽象type Result struct {	Type Type // 该结构体在Json中的类型	Raw string // 原json串	Str string // 字符串	Num float64 // 浮点数	Index int // 索引 }复制代码

3. 属于Result的函数

func (t Result) Exists() bool // 判断某值是否存在func (t Result) Value() interface{} // func (t Result) Int() int64func (t Result) Uint() uint64func (t Result) Float() float64func (t Result) String() stringfunc (t Result) Bool() boolfunc (t Result) Time() time.Timefunc (t Result) Array() []gjson.Resultfunc (t Result) Map() map[string]gjson.Resultfunc (t Result) Get(path string) Resultfunc (t Result) ForEach(iterator func(key, value Result) bool) // 可传闭包函数func (t Result) Less(token Result, caseSensitive bool) bool复制代码

4. 初始化函数

gjson.Parse(json).Get("name").Get("last")gjson.Get(json, "name").Get("last")gjson.Get(json, "name.last")复制代码

5. 判断Json是否合法

if !gjson.Valid(json) {	return errors.New("invalid json")}复制代码

三、实际操作

1. 使用

package mainimport (	"fmt"	"log"	"strings"	"github.com/tidwall/gjson")const json = `{"name":{"first":"Tom","last":"Anderson"},"age":37,"children":["Sara","Alex","Jack"],"fav.movie":"Deer Hunter","friends":[{"first":"Dale","last":"Murphy","age":44},{"first":"Roger","last":"Craig","age":68},{"first":"Jane","last":"Murphy","age":47}]}`func main() {	// 首先我们判断该json是否合法	if !gjson.Valid(json) {		log.Fatalf("%s", "invalid json")	}	// 获取Json中的age	age := gjson.Get(json, `age`).Int()	fmt.Printf("%T, %+v\n", age, age)	// 获取lastname	lastname := gjson.Get(json, `name.last`).String()	fmt.Printf("%T, %+v\n", lastname, lastname)	// 获取children数组	for _, v := range gjson.Get(json, `children`).Array() {		fmt.Printf("%q ", v.String())	}	fmt.Println()	// 获取第二个孩子	fmt.Printf("%q\n", gjson.Get(json, `children.1`).String())	fmt.Printf("%q\n", gjson.Get(json, `children|1`).String())	// 通配符获取第三个孩子	fmt.Printf("%q\n", gjson.Get(json, `child*.2`).String())	// 反转数组函数	fmt.Printf("%q\n", gjson.Get(json, `children|@reverse`).Array())	// 自定义函数 - 全转大写	gjson.AddModifier("case", func(json, arg string) string {		if arg == "upper" {			return strings.ToUpper(json)		}		return json	})	fmt.Printf("%+v\n", gjson.Get(json, `children|@case:upper`).Array())	// 直接解析为map	jsonMap := gjson.Parse(json).Map()	fmt.Printf("%+v\n", jsonMap)	for _, v := range jsonMap {		fmt.Printf("%T, %+v\n", v, v)	}}复制代码

转载于:https://juejin.im/post/5cbd9d12f265da037516a10a

你可能感兴趣的文章
python “双”稀疏矩阵转换为最小联通量“单”矩阵
查看>>
揭秘天猫双11背后:20万商家600万张海报,背后只有一个鹿班
查看>>
重置mysq root密码脚本
查看>>
我的友情链接
查看>>
MHA配置参数
查看>>
深入理解Lock
查看>>
vim的块选择
查看>>
HTML --块
查看>>
在DLL中获取主进程窗口句柄
查看>>
基于消息队列的双向通信
查看>>
一个不错的loading效果
查看>>
Debian允许root用户登录
查看>>
linux的文件系统
查看>>
上云利器,K8S应用编排设计器之快到极致
查看>>
袋鼠云服务案例系列 | 从DB2到MySQL,某传统金融平台的互联网转型之路
查看>>
RealServer配置脚本
查看>>
九月份技术指标 华为交换机的简单配置
查看>>
python 写json格式字符串到文件
查看>>
分布式文件系统MogileFS
查看>>
电力线通信载波模块
查看>>