添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

Golang 从 Json 串中快速取出需要的字段

在 web 编程中很多情况下接口的数据是 json 格式,在我们拿到接口的 json 数据后如何方便地从中提取出需要的字段呢?我们可以自定义一个结构体,然后通过 Golang 的标准库 json 解析到我们定义的结构体中。但是当 json 格式比较复杂,嵌套层级比较深的时候,还是用这种方法就比较麻烦了。在这里推荐一个包: gojsonq ,可以很简便地从 json 串中提取出需要的字段,无需定义额外的结构体,然后解析,直接链式地从 json 串中提取需要的字段即可,有点类似动态语言:

go get github.com/thedevsaddam/gojsonq/v2
  • Github 地址:
    https://github.com/thedevsaddam/gojsonq

  • Package 简介:
    A simple Go package to Query over JSON Data. It provides simple, elegant and fast ODM like API to access, query JSON document.

示例一:从如下 json 串中提取 name.first 字段数据

"name":{ "first":"Tom", "last":"Hanks" "age":61

Find 方法返回的结果为 interface{} 类型。

package main
import gojsonq "github.com/thedevsaddam/gojsonq/v2"
func main() {
	const json = `{"name":{"first":"Tom","last":"Hanks"},"age":61}`
	name := gojsonq.New().FromString(json).Find("name.first")
	println(name.(string)) // Tom

示例二:从如下 json 串中提取 temperatures 字段数据,并计算平均值

"city":"dhaka", "type":"weekly", "temperatures":[ 39.9, 35.4, 33.5, 31.6, 33.2,

支持列表计算:

package main
import (
	"fmt"
	gojsonq "github.com/thedevsaddam/gojsonq/v2"
func main() {
	const json = `{"city":"dhaka","type":"weekly","temperatures":[30,39.9,35.4,33.5,31.6,33.2,30.7]}`
	avg := gojsonq.New().FromString(json).From("temperatures").Avg()
	fmt.Printf("Average temperature: %.2f", avg) // 33.471428571428575

示例三:从如下 json 串中提取 data.pageNumber 数组,赋值给 Golang 整型数组

上面的例子提取简单的数值类型,返回的是 interface{} 类型,可以通过类型断言得到需要的数据。如果提取的是数组类型,是无法通过类型断言来获取 interface{} 类型的值的,可以使用 FindR 拿到结果,然后通过结果的 As 方法将数据解析到我们定义的变量类型中。

"code":"0", "message":"success", "data":{ "thumb_up":0, "system":0, "im":0, "avatarUrl":"https://profile.csdnimg.cn/F/4/B/helloworld", "invitation":0, "comment":0, "follow":0, "totalCount":0, "coupon_order":0, "pageNumbers":[ "status":true
func main() {
	jsonStr := `{
   "code":"0",
   "message":"success",
   "data":{
       "thumb_up":0,
       "system":0,
       "im":0,
       "avatarUrl":"https://profile.csdnimg.cn/F/4/B/helloworld",
       "invitation":0,
       "comment":0,
       "follow":0,
       "totalCount":0,
       "coupon_order":0,
       "pageNumbers":[
   "status":true
	// 保存 json 字符串中 pageNumbers 字段列表数据
	pageNumbers := make([]int, 0)
	result, err := gojsonq.New().FromString(jsonStr).FindR("data.pageNumbers")
	if err != nil {
		fmt.Println(err)
	// 将提前的数据解析为自定义变量类型
	err = result.As(&pageNumbers)
	if err != nil {
		fmt.Println(err)
	fmt.Println(pageNumbers)

更多功能及示例见官方文档:
https://github.com/thedevsaddam/gojsonq/wiki/Queries

Golang 从 Json 串中快速取出需要的字段在 web 编程中很多情况下接口的数据是 json 格式,在我们拿到接口的 json 数据后如何方便地从中提取出需要的字段呢?我们可以自定义一个结构体,然后通过 Golang 的标准库 json 解析到我们定义的结构体中。但是当 json 格式比较复杂,嵌套层级比较深的时候,还是用这种方法就比较麻烦了。在这里推荐一个包: gojsonq,可以很简便地从 json 串中提取出需要的字段,无需定义额外的结构体,然后解析,直接链式地从 json 串中提取需要的字
GoJSON GoJSON是一个快速而简单的包,用于在 json 中编组/解组结构体。 您可以使用GoJSON工具生成编组/解组代码,在基准测试中, GoJSON的生成代码几乎比encoding/json快 6~7 倍。 # install go get - u - v github . com / go - fish / gojson cd ${ GOPATH } / src / github . com / go - fish / gojson / cmd go build - o gojson main . go # usage gojson [ options ] < input dir | file > - inline Use inline function in generate code ( default true )
1.json-iterator介绍 jsoniter ( json-iterator )是一款快且灵活的 JSON 解析器,同时提供 Java 和 Go 两个版本Jsoniter 是最快的 JSON 解析. 器。它最多能比普通的解析器快 10 倍之多,即使在数据绑定的用法下也有同样的性能优势。 golang中的跑分: 2.提取Json指定字段数据 有时候,例如一个JSON对象很大...
JSON(JavaScript Object Notation)是一种基于JavaScript语法子集的开放标准数据交换格式。JSON是基于文本的,轻量级的,通常被认为易于读/写。 Json是一种比XML更轻量级的数据交换格式,更适合成为较为理想,跨平台,跨语言的数据交换语言,成为项目配置文件的首选。开发者可以用Json传输简单的字符串,数字,布尔值,也可以传输一个数组...
最近在操作json数据上遇到一些有趣的东西,之前以为最复杂不过就是JSON.parse和JSON.stringify。在做项目的时候有一个需求,后台返回的数据是所有类型的值,而我需要将它们分类,同一类型为一组,然后再截取我需要字段。做法是var aSearch = []; var aTemp = data.filter(function(i){ return i.dataType.inc...
JavaScript对象简谱(JSON, Java Script Object Notation)是一种用于发送和接收结构化信息的标准协议。在类似的协议中,JSON并不是唯一的一个标准协议。 XML(§7.14)、ASN.1和Google的Protocol Buffers都是类似的协议,并且有各自的特色,但是由于简洁性、可读性和流行程度等原因,JSON是应用最广泛的一个。 Go语言对于这些标准格式的编码和解码都有良好的支持,由标准库中的encoding/json、encoding/xml、enco
比如现在数组里面是:"TJ-8122A-F";"2019-11-19 11:14:28";"19092401";"猪浓缩-8122A/8296T";"ALA";"1.68";"1.55";"0.42"; 注意里面是 ; 符号分割的 。。。。 func main() { arry = " "TJ-8122A-F";"2019-11-19 11:14:28";"19092401";...
golang 中,将字符串转换为 json 格式时,会自动将一些特殊字符添加反斜杠进行转义,如双引号、反斜杠、换行符等。这样做是为了避免这些特殊字符对 json 格式的解析产生干扰。 但有些时候,我们需要将这些转义字符去掉,得到原始的字符串内容。这时可以使用 strconv 包中的 Unquote() 函数。 Unquote() 函数会将字符串中表示转义字符的反斜杠去除,并将实际的字符转义为其对应的 ASCII 字符。如果字符串不是以双引号包裹的,则会返回一个错误。 示例代码如下: package main import ( "fmt" "strconv" func main() { jsonStr := `{"name":"golang","version":"1.16"}` fmt.Println(jsonStr) unquotedStr, err := strconv.Unquote(jsonStr) if err != nil { fmt.Println(err) return fmt.Println(unquotedStr) 输出结果如下: {"name":"golang","version":"1.16"} {name:golang,version:1.16} 可以看到,经过 Unquote() 处理后,字符串中的双引号已经去掉了,而转义的字符也被正确还原。
CSDN-Ada助手: 非常感谢CSDN博主分享的关于SpringBoot使用Redis分布式锁解决并发问题的文章,我觉得这个主题非常实用,对于很多开发者来说都具有很大的参考价值。如果你想深入探究分布式锁的应用场景,可以考虑写一篇关于“Redis分布式锁原理与应用”的博客,相信会有更多读者受益。期待你的下一篇博客! 为了方便博主创作,提高生产力,CSDN上线了AI写作助手功能,就在创作编辑器右侧哦~(https://mp.csdn.net/edit?utm_source=blog_comment_recall )诚邀您来加入测评,到此(https://activity.csdn.net/creatActivity?id=10450&utm_source=blog_comment_recall)发布测评文章即可获得「话题勋章」,同时还有机会拿定制奖牌。 docker-compose 启动 Redis 服务 2018.11.13: 怎么指定配置文件呢? C++中rdbuf()简介及文件流的概念 秋山玉佩: Kubernetes 基于 EFK 技术栈的日志收集实践 iolahkuy: Kubernetes/K8S基于ELKStack日志采集与分析实践 下载地址:https://download.csdn.net/download/iolahkuy/87594936 Kong 微服务网关在 Kubernetes 的实践 m0_51498881: 大师好,麻烦指点。同一个集群,在kong a上配置了服务路由怎么就调用不到