• 请不要在回答技术问题时复制粘贴 AI 生成的内容
mentalidade
V2EX  ›  程序员

golang 怎么转化这个 struct?

  •  
  •   mentalidade · Nov 15, 2017 · 5815 views
    This topic created in 3129 days ago, the information mentioned may be changed or developed.

    请求 elk 的 post 参数是这个 json,两个 term,不同的 value,不知道是我写的这个结构体的有问题还是初始化有问题。求解怎么初始化?

    • 原始 json
    {
        "_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"
    					},},}
    				},
    			},
    		},
    	}
    
    34 replies    2018-09-02 11:51:48 +08:00
    janxin
        1
    janxin  
       Nov 15, 2017
    编译错误不是有么?没有指定类型
    zrelda
        2
    zrelda  
       Nov 15, 2017
    json.RawMessage
    shawngao
        3
    shawngao  
       Nov 15, 2017
    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
        4
    mentalidade  
    OP
       Nov 15, 2017
    @shawngao https://mholt.github.io/json-to-go/ 这个生成的丢失了第二个 term,第二个是 module
    mason961125
        5
    mason961125  
       Nov 15, 2017
    我觉得你可能需要 https://github.com/buger/jsonparser
    mason961125
        6
    mason961125  
       Nov 15, 2017
    哦,我以为是解析,当我没说
    mentalidade
        7
    mentalidade  
    OP
       Nov 15, 2017
    @zrelda v 站大神真的多,这个强
    mentalidade
        8
    mentalidade  
    OP
       Nov 15, 2017
    @mason961125 我是要编码,实在太深而且复杂
    mason961125
        9
    mason961125  
       Nov 15, 2017
    @mentalidade Go 处理 JSON 麻烦也不是一天两天了,只能忍着...
    loading
        10
    loading  
       Nov 15, 2017 via Android
    golang 除了 err nil,我最讨厌就是结构体了
    Morriaty
        11
    Morriaty  
       Nov 15, 2017
    你为什么要自己定义 struct query,而不是 interface{}?

    尤其是 es 本身的 query 参数就 N 多的,你枚举都枚举不完,难道你要每种 query 都建一个 struct ?
    mentalidade
        12
    mentalidade  
    OP
       Nov 15, 2017
    @Morriaty 其他的参数都不变的,就是这个时间换一下。需求多了,es 的 json 解开就痛苦无比了,求教
    mentalidade
        13
    mentalidade  
    OP
       Nov 15, 2017
    @janxin 明白了,嵌套的结构体没有在外面定义没法确定类型
    owenliang
        14
    owenliang  
       Nov 15, 2017
    解 json 会让人想死,最后走 unmarshal 直接反解到某个结构体。
    mentalidade
        15
    mentalidade  
    OP
       Nov 15, 2017
    @owenliang es 请求体里面的一个 json 体 body,搞的吐血,格式一变化就得另外在定义一个多层嵌套的结构体,
    mentalidade
        16
    mentalidade  
    OP
       Nov 15, 2017
    @mentalidade 光上面一个 filter 里面两个一模一样还不能合并的 term,就搞得我晕死,心态爆照
    jameshuazhou
        17
    jameshuazhou  
       Nov 15, 2017
    用 map[string]interface{},一层层套下去
    jameshuazhou
        18
    jameshuazhou  
       Nov 15, 2017
    type RMap map[string]interface{}

    req := RMap{
    "filter": []RMap{
    {"term": RMap{"loglvl.keyword": "ERROR"}},
    {"term": RMap{"module": "demo"}},
    }
    }
    mentalidade
        19
    mentalidade  
    OP
       Nov 15, 2017 via Android
    @jameshuazhou 多谢,我试试
    shawngao
        20
    shawngao  
       Nov 15, 2017
    @mentalidade 没细看,gjson 也不能满足你的要求么?
    shawngao
        21
    shawngao  
       Nov 15, 2017
    "query.bool.filter.1.term.module" >> "demo"
    没测,试试?
    mentalidade
        22
    mentalidade  
    OP
       Nov 16, 2017
    @jameshuazhou 感谢,这个方法可以的
    mentalidade
        23
    mentalidade  
    OP
       Nov 16, 2017
    @shawngao 感谢,我用了楼上的方法,可以了
    mnhkahn
        24
    mnhkahn  
       Nov 16, 2017
    es 的包都封装了这些,直接找个包方便些吧。自己写的话 filter 定义成一个接口,term、range 这些都实现 interface 就可以了。
    mengzhuo
        25
    mengzhuo  
       Nov 16, 2017 via iPhone
    好好用 elastic 驱动啊
    自己写也要用 json-to-go 啊
    mentalidade
        26
    mentalidade  
    OP
       Nov 16, 2017
    @mnhkahn 求问有 go 的包吗?
    mentalidade
        27
    mentalidade  
    OP
       Nov 16, 2017
    @mengzhuo 请问什么驱动?我就是用这个 json-to-go 转化的时候,它把 filter 里面第二个 term 过滤掉了,只有第一个
    mnhkahn
        28
    mnhkahn  
       Nov 16, 2017
    mentalidade
        29
    mentalidade  
    OP
       Nov 16, 2017
    @mnhkahn 好,谢谢
    mengzhuo
        30
    mengzhuo  
       Nov 16, 2017
    bomb77
        31
    bomb77  
       Jan 12, 2018
    不知道楼主对生成这种复杂嵌套 json 有什么其他好的办法了吗?
    用 17 楼的办法是拼出来了,可以还是感觉有些麻烦,和 go 里的 struct 不太相符
    mentalidade
        32
    mentalidade  
    OP
       Jan 12, 2018
    @bomb77 如果是定时脚本,以后不怎么变化的话自己解开,用 17 楼方法就好。如果经常变化的话,那就用 28 的库,直接拼装,解开可以用 fastjson 貌似,好处理一下
    bomb77
        33
    bomb77  
       Jan 12, 2018
    @mentalidade 谢谢回复,看来暂时还是用 map 手动拼吧,写分离的静态 struct 实在太麻烦了
    WilliamYang
        34
    WilliamYang  
       Sep 2, 2018
    说一个关于处理这种大型 json 的比较好的办法, 如果 json 结构比较固定, 可以写成模板, 传入参数, 再生成 json
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   4055 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 67ms · UTC 00:56 · PVG 08:56 · LAX 17:56 · JFK 20:56
    ♥ Do have faith in what you're doing.