首页 > 其他分享 >Golang一日一库之gjson

Golang一日一库之gjson

时间:2024-04-21 11:56:05浏览次数:15  
标签:gjson Get age Golang 一库 json Result fmt

官网

https://github.com/tidwall/gjson

一 简介

gjson实际上是get + json的缩写,用于读取 JSON 串

二 使用

1.安装

go get github.com/tidwall/gjson

2.使用

package main

import (
  "fmt"

  "github.com/tidwall/gjson"
)

func main() {
  json := `{"name":{"first":"li","last":"dj"},"age":18}`
  lastName := gjson.Get(json, "name.last")
  fmt.Println("last name:", lastName.String())

  age := gjson.Get(json, "age")
  fmt.Println("age:", age.Int())
}

只需要传入 JSON 串和要读取的键路径即可。注意一点细节,因为gjson.Get()函数实际上返回的是gjson.Result类型,我们要调用其相应的方法进行转换对应的类型。如上面的String()和Int()方法。
如果是直接打印输出,其实可以省略String(),fmt包的大部分函数都可以对实现fmt.Stringer接口的类型调用String()方法。

3. 遍历

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

const json = `
{
  "name":"dj",
  "age":18,
  "pets": ["cat", "dog"],
  "contact": {
    "phone": "123456789",
    "email": "[email protected]"
  }
}`

func main() {
  pets := gjson.Get(json, "pets")
  pets.ForEach(func(_, pet gjson.Result) bool {
    fmt.Println(pet)
    return true
  })

  contact := gjson.Get(json, "contact")
  contact.ForEach(func(key, value gjson.Result) bool {
    fmt.Println(key, value)
    return true
  })
}


4.一次性获得多个值

调用gjson.Get()一次只能读取一个值,多次调用又比较麻烦,gjson提供了GetMany()可以一次读取多个值,返回一个数组[]gjson.Result。

const json = `
{
  "name":"dj",
  "age":18,
  "pets": ["cat", "dog"],
  "contact": {
    "phone": "123456789",
    "email": "[email protected]"
  }
}`

func main() {
  results := gjson.GetMany(json, "name", "age", "pets.#", "contact.phone")
  for _, result := range results {
    fmt.Println(result)
  }
}

标签:gjson,Get,age,Golang,一库,json,Result,fmt
From: https://www.cnblogs.com/zichliang/p/18148751

相关文章

  • 转载Using Domain-Driven Design(DDD)in Golang
    转载自:https://dev.to/stevensunflash/using-domain-driven-design-ddd-in-golang-3ee5UsingDomain-DrivenDesign(DDD)inGolang#go#ddd#redis#postgresDomain-DrivenDesignpatternisthetalkofthetowntoday.Domain-DrivenDesign(DDD)isanapproachtosoft......
  • golang etcd键值存储系统
    目录存储配置文件watch命令在Go语言中,etcd是一个高可用的键值存储系统,它主要用于共享配置和服务发现。etcd由CoreOS团队开发,它是Kubernetes项目中用于存储所有集群数据的关键组件。etcd使用Raft协议来保持集群之间的数据一致性,并且提供了强一致性保证https://blog.csdn.net/jo......
  • golang+kafka
    目录1.安装JDK、Zookeeper、Scala、kafka2.启动kafka3.创建topics4.查看topics5.打开一个producer6.打开一个consumer7.测试发送和接收消息Windows下安装Kafka1.安装JDK、Zookeeper、Scala、kafka安装Kafka之前,需要安装JDK、Zookeeper、Scala。Kafka依赖Zookeeper,......
  • centos7安装golang最新版1.21.1
    #先卸载旧的golangyumremovegolang#然后找到最新版本https://golang.google.cn/dl/#下载安装cd/usr/local/src wgethttps://golang.google.cn/dl/go1.21.1.linux-amd64.tar.gztar-zxvfgo1.21.1.linux-amd64.tar.gz-C/usr/local/#增加配置文件vim/etc/profi......
  • Golang交替打印奇偶数
    packagemainimport( "fmt" "sync")varwgsync.WaitGroupfuncmain(){ evenCh,oddCh:=make(chanbool,1),make(chanbool,1) deferclose(evenCh) deferclose(oddCh) wg=sync.WaitGroup{} wg.Add(1) goprintNumbersSequent......
  • 脑洞golang embed 的使用场景
    golang的embed的功能真是一个很神奇的功能,它能把静态资源,直接在编译的时候,打包到最终的二进制程序中。为什么会设计这么一个功能呢?我想和golang的崇尚简单的原则有关系吧。它希望的是一个二进制文件能走天下,那么如果你作为一个web服务器,还需要依赖一大堆的静态文件,终究不......
  • golang JSON序列化和反序列化
    目录JSON序列化(Marshaling)JSON反序列化(Unmarshaling)错误处理和注意事项在Go语言(通常被称为Golang)中,JSON(JavaScriptObjectNotation)是一种常用的数据交换格式。Go标准库提供了encoding/json包,使得JSON的序列化(将Go数据结构转换为JSON格式的字符串)和反序列化(将JSON格式的字符串......
  • Golang 中 在gmp下,mutex 是如何并发的
    在Go语言的并发模型中,GMP(Goroutine、Machine、Processor)模型是核心概念,其中Mutex(互斥锁)扮演着关键的角色,用于同步并发访问共享资源,防止数据竞争和不一致性问题。以下是Mutex在GMP模型下实现并发的详细解释:Goroutines(协程)轻量级的线程:Goroutines是Go语言中的轻量级线程,它......
  • golang实现R6900路由器外网IP更新通知程序
    程序一分钟执行一次,检测路由器外网IP地址变更则自动发送邮件,使用网易126smtp协议发送邮件,邮箱地址及授权码请自行替换,getIp函数中的grep根据自己的网卡信息调试替换R6900路由器的交叉编译语句:CGO_ENABLED=0GOOS=linuxGOARCH=armGOARM=5gobuildxxxx.go1234567......
  • 基于Golang的Nano游戏服务器框架
    在游戏开发过程中,一个高效的服务器框架是至关重要的。Nano正是这样一个框架,它以Golang为基础,提供了轻量级、高性能的服务器解决方案。下面,我们将深入探讨Nano的设计理念、核心特性以及如何在实战中使用它。Nano框架概述Nano是一个针对游戏服务器的框架,能够帮助开发者快速......