golang 怎么转化这个 struct?

2017-11-15 17:21:24 +08:00
 mentalidade

请求 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"
					},},}
				},
			},
		},
	}
5022 次点击
所在节点    程序员
34 条回复
janxin
2017-11-15 17:29:25 +08:00
编译错误不是有么?没有指定类型
zrelda
2017-11-15 17:31:29 +08:00
json.RawMessage
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"`
}
mentalidade
2017-11-15 17:41:41 +08:00
@shawngao https://mholt.github.io/json-to-go/ 这个生成的丢失了第二个 term,第二个是 module
mason961125
2017-11-15 17:43:05 +08:00
我觉得你可能需要 https://github.com/buger/jsonparser
mason961125
2017-11-15 17:43:43 +08:00
哦,我以为是解析,当我没说
mentalidade
2017-11-15 17:45:35 +08:00
@zrelda v 站大神真的多,这个强
mentalidade
2017-11-15 17:46:29 +08:00
@mason961125 我是要编码,实在太深而且复杂
mason961125
2017-11-15 17:50:49 +08:00
@mentalidade Go 处理 JSON 麻烦也不是一天两天了,只能忍着...
loading
2017-11-15 17:52:43 +08:00
golang 除了 err nil,我最讨厌就是结构体了
Morriaty
2017-11-15 18:19:07 +08:00
你为什么要自己定义 struct query,而不是 interface{}?

尤其是 es 本身的 query 参数就 N 多的,你枚举都枚举不完,难道你要每种 query 都建一个 struct ?
mentalidade
2017-11-15 18:44:43 +08:00
@Morriaty 其他的参数都不变的,就是这个时间换一下。需求多了,es 的 json 解开就痛苦无比了,求教
mentalidade
2017-11-15 19:00:02 +08:00
@janxin 明白了,嵌套的结构体没有在外面定义没法确定类型
owenliang
2017-11-15 19:02:42 +08:00
解 json 会让人想死,最后走 unmarshal 直接反解到某个结构体。
mentalidade
2017-11-15 19:41:08 +08:00
@owenliang es 请求体里面的一个 json 体 body,搞的吐血,格式一变化就得另外在定义一个多层嵌套的结构体,
mentalidade
2017-11-15 19:42:27 +08:00
@mentalidade 光上面一个 filter 里面两个一模一样还不能合并的 term,就搞得我晕死,心态爆照
jameshuazhou
2017-11-15 19:46:15 +08:00
用 map[string]interface{},一层层套下去
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"}},
}
}
mentalidade
2017-11-15 20:28:23 +08:00
@jameshuazhou 多谢,我试试
shawngao
2017-11-15 20:54:34 +08:00
@mentalidade 没细看,gjson 也不能满足你的要求么?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/406663

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX