请求 elk 的 post 参数是这个 json,两个 term,不同的 value,不知道是我写的这个结构体的有问题还是初始化有问题。求解怎么初始化?
{
"_source": {
"excludes": [
"offset",
"*type",
"beat",
"*timestamp"
]
},
"query": {
"bool": {
"filter": [
{
"term": {
"loglvl.keyword": "ERROR"
}
},
{
"term": {
"module": "demo"
}
},
{
"range": {
"logtime": {
"gte": "2017-10-20T09:45:35.015+0800",
"lte": "2017-10-24T09:45:35.015+0800"
}
}
}
]
}
}
}
type RequestValue struct {
Source struct {
Excludes []string `json:"excludes"`
} `json:"_source"`
Query struct {
Bool struct {
Filter []struct {
Term struct {
LoglvlKeyword string `json:"loglvl.keyword,omitempty"`
Module string `json:"module,omitempty"`
} `json:"term,omitempty"`
Range struct {
Logtime struct {
Gte string `json:"gte"`
Lte string `json:"lte"`
} `json:"logtime"`
} `json:"range,omitempty"`
} `json:"filter"`
} `json:"bool"`
} `json:"query"`
}
我这么初始化,想写一个当前时间的 Gte 的 value。
model.RequestValue{
Source: {
Excludes: {"offset", "*type", "beat", "*timestamp"}
},
Query: {
Bool: {
Filter: {
{Term: {LoglvlKeyword: "ERROR"}},
{Term: {Module: "demo"}},
{Range: {Logtime: {Gte: "2017-10-20T09:45:35.015+0800",
Lte: "2017-10-24T09:45:35.015+0800"
},},}
},
},
},
}
1
janxin 2017-11-15 17:29:25 +08:00
编译错误不是有么?没有指定类型
|
2
zrelda 2017-11-15 17:31:29 +08:00
json.RawMessage
|
3
shawngao 2017-11-15 17:33:36 +08:00
type AutoGenerated struct {
Source struct { Excludes []string `json:"excludes"` } `json:"_source"` Query struct { Bool struct { Filter []struct { Term struct { LoglvlKeyword string `json:"loglvl.keyword"` } `json:"term,omitempty"` Range struct { Logtime struct { Gte string `json:"gte"` Lte string `json:"lte"` } `json:"logtime"` } `json:"range,omitempty"` } `json:"filter"` } `json:"bool"` } `json:"query"` } |
4
mentalidade OP @shawngao https://mholt.github.io/json-to-go/ 这个生成的丢失了第二个 term,第二个是 module
|
5
mason961125 2017-11-15 17:43:05 +08:00
我觉得你可能需要 https://github.com/buger/jsonparser
|
6
mason961125 2017-11-15 17:43:43 +08:00
哦,我以为是解析,当我没说
|
7
mentalidade OP @zrelda v 站大神真的多,这个强
|
8
mentalidade OP @mason961125 我是要编码,实在太深而且复杂
|
9
mason961125 2017-11-15 17:50:49 +08:00
@mentalidade Go 处理 JSON 麻烦也不是一天两天了,只能忍着...
|
10
loading 2017-11-15 17:52:43 +08:00 via Android
golang 除了 err nil,我最讨厌就是结构体了
|
11
Morriaty 2017-11-15 18:19:07 +08:00
你为什么要自己定义 struct query,而不是 interface{}?
尤其是 es 本身的 query 参数就 N 多的,你枚举都枚举不完,难道你要每种 query 都建一个 struct ? |
12
mentalidade OP @Morriaty 其他的参数都不变的,就是这个时间换一下。需求多了,es 的 json 解开就痛苦无比了,求教
|
13
mentalidade OP @janxin 明白了,嵌套的结构体没有在外面定义没法确定类型
|
14
owenliang 2017-11-15 19:02:42 +08:00
解 json 会让人想死,最后走 unmarshal 直接反解到某个结构体。
|
15
mentalidade OP @owenliang es 请求体里面的一个 json 体 body,搞的吐血,格式一变化就得另外在定义一个多层嵌套的结构体,
|
16
mentalidade OP @mentalidade 光上面一个 filter 里面两个一模一样还不能合并的 term,就搞得我晕死,心态爆照
|
17
jameshuazhou 2017-11-15 19:46:15 +08:00
用 map[string]interface{},一层层套下去
|
18
jameshuazhou 2017-11-15 19:51:21 +08:00
type RMap map[string]interface{}
req := RMap{ "filter": []RMap{ {"term": RMap{"loglvl.keyword": "ERROR"}}, {"term": RMap{"module": "demo"}}, } } |
19
mentalidade OP @jameshuazhou 多谢,我试试
|
20
shawngao 2017-11-15 20:54:34 +08:00
@mentalidade 没细看,gjson 也不能满足你的要求么?
|
21
shawngao 2017-11-15 20:57:40 +08:00
"query.bool.filter.1.term.module" >> "demo"
没测,试试? |
22
mentalidade OP @jameshuazhou 感谢,这个方法可以的
|
23
mentalidade OP @shawngao 感谢,我用了楼上的方法,可以了
|
24
mnhkahn 2017-11-16 09:14:26 +08:00
es 的包都封装了这些,直接找个包方便些吧。自己写的话 filter 定义成一个接口,term、range 这些都实现 interface 就可以了。
|
25
mengzhuo 2017-11-16 09:30:58 +08:00 via iPhone
好好用 elastic 驱动啊
自己写也要用 json-to-go 啊 |
26
mentalidade OP @mnhkahn 求问有 go 的包吗?
|
27
mentalidade OP @mengzhuo 请问什么驱动?我就是用这个 json-to-go 转化的时候,它把 filter 里面第二个 term 过滤掉了,只有第一个
|
28
mnhkahn 2017-11-16 09:41:00 +08:00
|
29
mentalidade OP @mnhkahn 好,谢谢
|
30
mengzhuo 2017-11-16 10:11:42 +08:00
|
31
bomb77 2018-01-12 12:16:50 +08:00
不知道楼主对生成这种复杂嵌套 json 有什么其他好的办法了吗?
用 17 楼的办法是拼出来了,可以还是感觉有些麻烦,和 go 里的 struct 不太相符 |
32
mentalidade OP @bomb77 如果是定时脚本,以后不怎么变化的话自己解开,用 17 楼方法就好。如果经常变化的话,那就用 28 的库,直接拼装,解开可以用 fastjson 貌似,好处理一下
|
33
bomb77 2018-01-12 13:52:51 +08:00
@mentalidade 谢谢回复,看来暂时还是用 map 手动拼吧,写分离的静态 struct 实在太麻烦了
|
34
WilliamYang 2018-09-02 11:51:48 +08:00
说一个关于处理这种大型 json 的比较好的办法, 如果 json 结构比较固定, 可以写成模板, 传入参数, 再生成 json
|