go解析Webページjsonデータの取得

2161 ワード

ここではnginx検出ページデータを例に
1、参照jsonフォーマット定義構造体、実際のjsonデータフォーマットに基づいて定義
type Tmp struct {
	Index		int	`json:"index"`
	Upstream	string	`json:"upstream"`
	Name		string	`json:"name"`
	Status		string	`json:"status"`
	Rise		int	`json:"rise"`
	Fall		int	`json:"fall"`
	Type		string	`json:"type"`
	Port		int	`json:"port"`
}
type Temp struct {
	Upstream	string		`json:"upstream"`
	Name		[]string	`json:"name"`
}
type Ses struct {
	Total		int		`json:"total"`
	Generation	int		`json:"generation"`
	Server		[]*Tmp		`json:"server"`
}
type Nginx struct {
	Servers		Ses		`json:"servers"`
}

2、処理データ、ここではnginx検出ページのupstreamとname情報を取得して新しいデータを構成しjsに返す例
data := make([]*models.Temp, 0)
		servers := &models.Ss{}
		addresses := url_list  //nginx      
		for _, address := range addresses {
			server := make([]*models.Tmp, 0)
			addr := address.TgtAddress
			//  web    
			resp, _ := http.Get(addr)
			body, err := ioutil.ReadAll(resp.Body)

			if err != nil {
				continue
			}else {
				json.Unmarshal(body, servers)

				server = servers.Servers.Server
				for _, temp := range server {
					t := &models.Temp{}
					ups := temp.Upstream
					ad := temp.Name
					re := tool.IsExit(data, ups)
					if re == false {
						t.Upstream = ups
						t.Name = append(t.Name, ad)
						data = append(data, t)
					}else {
						for k, v := range data {
							if v.Upstream == ups {
								r := tool.Exit(v.Name, ad)
								if r == false {
									v.Name = append(v.Name, ad)
									data[k] = v
								}
							}
						}
					}
				}
			}
		}
		//     js
		m.jsonResult(conf.JRCodeSucc, "", data)

jsonResult関数の定義
type JsonResult struct {
	Code	conf.JsonResultCode	`json:"code"`
	Msg	string			`json:"msg"`
	Obj	interface{}		`json:"obj"`
}

func (c *BaseController) jsonResult(code conf.JsonResultCode, msg string, obj interface{})  {
	result := &models.JsonResult{code, msg, obj}
	c.Data["json"] = result
	c.ServeJSON()
	c.StopRun()
}