go语言搬砖之go jmespath实现查询json数据

目录
  • 简介
  • 例子
  • 小结

简介

go-jmespath是用Go语言实现jmespath的一个库,jmespath是json的查询语言,所以在Go中利用go-jmespath可以做到查询json的作用

go-jmespath官网: https://github.com/jmespath/go-jmespath

jmespath官网:https://jmespath.org/

jmespath学习: https://jmespath.org/tutorial.html

go-jmespath和linux系统jq命令功能非常相似,让Go处理json数据更加方便

例子

以下例子来源来go-jmespath官方文档和jmespath官网的学习文档总结

package main
import (
   "encoding/json"
   "fmt"
   "github.com/jmespath/go-jmespath"
)
func main() {
   //基本查询
   var jsonData = []byte(`{"foo": {"bar": {"baz":[0,1,2,3,4]}}}`)
   var data interface{}
   err := json.Unmarshal(jsonData, &data)
   if err != nil {
      fmt.Println(err)
   }
   re1, _ := jmespath.Search("foo.bar", data)
   fmt.Println("data查询结果: ", re1)
   re2, _ := jmespath.Search("foo.bar.baz[2]", data)
   fmt.Println("data查询结果: ", re2)
   //通配符查询
   var jsonData2 = []byte(`{"foo": [{"first": "a", "last": "b"},
                           {"first": "c", "last": "d"}]}`)
   var data2 interface{}
   _ = json.Unmarshal(jsonData2, &data2)
   re3, _ := jmespath.Search("foo[*].first", data2)
   fmt.Println("data2查询结果: ", re3)
   re4, _ := jmespath.Search("foo[:1].first", data2)
   fmt.Println("data2查询结果: ", re4)
   //运算符查询
   var jsonData3 = []byte(`{"foo": [{"age": 20}, {"age": 25},
                           {"age": 30}, {"age": 35},
                           {"age": 40}]}`)
   var data3 interface{}
   _ = json.Unmarshal(jsonData3, &data3)
   re5, _ := jmespath.Search("foo[?age > `30`]", data3)
   fmt.Println("data3查询结果: ", re5)
   //过滤查询
   var jsonData4 = []byte(`{
    "machines": [
        {"name": "a", "state": "running"},
        {"name": "b", "state": "stopped"},
        {"name": "b", "state": "running"}]
    }`)
   var data4 interface{}
   _ = json.Unmarshal(jsonData4, &data4)
   re6, _ := jmespath.Search("machines[?state=='running'].name", data4)
   fmt.Println("data4查询结果: ", re6)
   //管道查询
   var jsonData5 = []byte(`{
    "people": [
        {"first": "James", "last": "d"},
        {"first": "Jacob", "last": "e"},
        {"first": "Jayden", "last": "f"},
        {"missing": "different"}
     ],
     "foo": {"bar": "baz"}
    }`)
   var data5 interface{}
   _ = json.Unmarshal(jsonData5, &data5)
   re7, _ := jmespath.Search("people[*].first | [0]", data5)
   fmt.Println("data5查询结果: ", re7)
   //多选查询并带自定义名称
   var jsonData6 = []byte(`{
    "people": [
    {
      "name": "a",
      "state": {"name": "up"}
    },
    {
      "name": "b",
      "state": {"name": "down"}
    },
    {
      "name": "c",
      "state": {"name": "up"}
    }
    ]
    }`)
   var data6 interface{}
   _ = json.Unmarshal(jsonData6, &data6)
   re8, _ := jmespath.Search("people[].{Name: name, State: state.name}", data6)
   fmt.Println("data6查询结果: ", re8)
   //函数
   var jsonData7 = []byte(`{
    "people": [
    {
      "name": "b",
      "age": 30,
      "state": {"name": "up"}
    },
    {
      "name": "a",
      "age": 50,
      "state": {"name": "down"}
    },
    {
      "name": "c",
      "age": 40,
      "state": {"name": "up"}
    }
    ]
    }`)
   var data7 interface{}
   _ = json.Unmarshal(jsonData7, &data7)
   re9, _ := jmespath.Search("length(people)", data7)
   fmt.Println("data7查询结果: ", re9)
   re10, _ := jmespath.Search("max_by(people, &age).name", data7)
   fmt.Println("data7查询结果: ", re10)
}

小结

上述例子演示了7种不同方式的查询,基本能覆盖日常json查询的需求了

go-jmespath包完全模拟了jmespath的语法在Go语言中进行json数据查询。只需要知道一个Search方法,第一个参数传入查询表达式,第二参数格式化数据,就可以轻松的在Go里面查询json数据了

以上就是go语言搬砖之go jmespath实现查询json数据的详细内容,更多关于go jmespath查询json数据的资料请关注我们其它相关文章!

(0)

相关推荐

  • go语言中json数据的读取和写出操作

    go自带json库,在使用时需要通过 import "encoding/json"来导入该库. 在读取和写入json数据之前需要定义相关的结构体来对应被操作的json数据的格式,并且结构体中需要导出或导入的变量首字母大写. 其中,json.Marshal()用于将一个对象转换为json格式的字节数组,json.Unmarshal()用于将json格式的字节数组转换为一个对象. 具体使用示例如下所示: 首先,定义结构体: type Com struct { Name string Nod

  • 在Go语言程序中使用gojson来解析JSON格式文件

    gojson是快速解析json数据的一个golang包,你使用它可以快速的查找json内的数据 安装 go get github.com/widuu/gojson 使用简介 结构 复制代码 代码如下: type Js struct {     data interface{} } (1) func Json(data) *Js data为string类型,初始化Js结构,解析json并且return Js.data 复制代码 代码如下: json := `{"from":"e

  • Go语言实现JSON解析的方法详解

    目录 1.json序列化 2.Json反序列化为结构体对象 3.Json反序列化为map类型 4.Tag的使用 在日常项目中,使用Json格式进行数据封装是比较常见的操作,看一下golang怎么实现. 1.json序列化 将json字符串转为go语言结构体对象. package main import ( "encoding/json" "errors" "fmt" ) var parseJsonError = errors.New("

  • 使用Go语言解析动态JSON格式的方法

    通常使用Golang encoding/json 标准库可以方便的编码/解析JSON数据,但是前提需要定义struct数据结构.特别是解析未知结构的JSON数据时,原有方法很难满足需求了,本文主要介绍动态解析JSON格式. Go语言的JSON 库 Go语言自带的JSON转换库为 encoding/json 1.1)其中把对象转换为JSON的方法(函数)为 json.Marshal(),其函数原型如下 func Marshal(v  interface{}) ([]byte, error) 也就是

  • go语言搬砖之go jmespath实现查询json数据

    目录 简介 例子 小结 简介 go-jmespath是用Go语言实现jmespath的一个库,jmespath是json的查询语言,所以在Go中利用go-jmespath可以做到查询json的作用 go-jmespath官网: https://github.com/jmespath/go-jmespath jmespath官网:https://jmespath.org/ jmespath学习: https://jmespath.org/tutorial.html go-jmespath和linu

  • Go语言kafka生产消费消息实例搬砖

    目录 kafka go库 注意 例子 kafka go库 kafka go客户端官方目前没有提供,但在github有2个非常流行的库 星星较多,网上案例也多 https://github.com/Shopify/sarama confluent官网提供的库 https://github.com/confluentinc/confluent-kafka-go 这里使用sarama,因为星星多,案例多,方便快速上手 注意 如果kafka版本在2.2以下,需要在go.mod里面将sarama版本改为g

  • Go语言中转换JSON数据简单例子

    Go语言转换JSON数据真是非常的简单. 以EasyUI的Demo为例,将/demo/datagrid/datagrid_data1.json 拷贝到$GOPATH/src目录: JSON.go: 复制代码 代码如下: package main import (         "encoding/json"         "fmt"         "io/ioutil" ) type product struct {         Pro

  • c语言单词本的新增、删除、查询按顺序显示功能

    c语言单词本的新增,删除,查询,按顺序显示 #include<stdio.h> #include<string.h> #define SIZE 100 int addword(char p[][20], int n); int findword(char p[][20], int n, char *f); int delword(char p[][20], int n, char *f); void display(char p[][20], int n); void menu()

  • Python利用jmespath模块进行json数据处理

    jmespath是python的第三方模块,是需要额外安装的.它在python原有的json数据处理上 做出了很大的贡献,至于效果接下来试试就知道了有多方便. 话不多说,我们直接进入正题… 既然是第三方的库,那肯定是要安装的.通过pip的方式先将jmespath库安装好… pip install jmespath 将安装好的模块导入到代码块中… import jmespath as jp jmespath中有一个很重要.很方便的函数那就是search,不管你的json数据有多么变态,它都能给你找

  • Go语言对JSON数据进行序列化和反序列化

    golang中对json的序列化/反序列化操作还是比较容易的,序列化操作主要是通过encoding/json包的Marshal()方法来实现,反序列化操作主要是通过encoding/json包的Unmarshal()方法来实现. //JSON序列化和反序列化 //可用在api序列化输出 //转成结构体,方便程序操作等 package main import ( "encoding/json" "fmt" ) type Response1 struct { Page

  • Go语言ORM包中使用worm构造查询条件的实例详解

    目录 构造查询条件 main函数 数据库表与数据模型 通过ID来查询数据 通过Where函数来查询数据 XXXIf查询 in.not in查询 嵌套查询语句 Limit与Offset orderby查询 构造查询条件 worm是一款方便易用的Go语言ORM库.worm支Model方式(持结构体字段映射).原生SQL以及SQLBuilder三种模式来操作数据库,并且Model方式.原生SQL以及SQLBuilder可混合使用. Model方式.SQL builder支持链式API,可使用Where

  • 嵌入式项目使用C语言结构体位段特性实现断言宏校验数据范围有效性的方法

    关于位段的特性这里就不多说了,多去看看相应的C语言书籍都会有介绍了. 今天来介绍断言宏.什么是断言宏?断言宏可以认为是校验数据范围的有效性的一个宏的实现.我们来看看代码: #include <stdio.h> //结构体位段 #define CHECK(x) sizeof(struct {unsigned:(-!!(x));}) //检查常量是否在一定范围之内,如果不在范围之内,则编译报错 //比如定义一个0到1000的范围,如果传入的xxx小于0或者大于1000,则编译器发现会报错 #def

  • R语言 实现两表连接且输出不重复数据

    在做项目中遇到了如此问题,其中整理的结果表中没有会员ID信息,只有会员电话号码信息,且每一行为唯一一个会员. 另外一张member表中包含会员ID以及会员电话信息,但是这张表有重复的会员信息,也就是说一个会员在member表中多次出现,memeber表比整理的表要大很多. 说明: 1.在项目过程中,数据量较大,用到的是data.table包,需要用到SQL中的语句减少代码量,因此需要sqldf包. 2.以下例子中xx中的a1在yy中都有对应的值. 3.yy中的a1与b是一一对应的关系,不存在同一

  • C语言数组按协议存储与按协议解析数据的实现

    协议需求: (1)序列号(1个字节) 属性(1个字节) 名称(18个字节) (2)现有一块空间为600个字节,以20个字节为单位,分别存储以上数据,直到存满为止,并能解析. 根据协议,我们可以设计一个结构体来表述这些数据: struct Data_Info { char serial_num ; //序列号 char property ; //属性 char sample_name[18]; //分类名称 }; 恰恰在做嵌入式开发或者有关协议的开发就会要求类似这样的需求,我们可以写一个简单的C程

随机推荐