简介
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官网的学习文档总结
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
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数据的资料请关注服务器之家其它相关文章!
原文链接:https://juejin.cn/post/7033943617764851726