我试图从下面的curl输出中获取说“ ip”的值:
{ "type":"example", "data":{ "name":"abc", "labels":{ "key":"value" } }, "subsets":[ { "addresses":[ { "ip":"192.168.103.178" } ], "ports":[ { "port":80 } ] } ] }
我在互联网上发现了许多示例来解析curl请求的json输出,并且编写了以下代码,但这似乎并没有给我说“ ip”的值
package main import ( "encoding/json" "fmt" "io/ioutil" "log" "net/http" "time" ) type svc struct { Ip string `json:"ip"` } func main() { url := "http://myurl.com" testClient := http.Client{ Timeout: time.Second * 2, // Maximum of 2 secs } req, err := http.NewRequest(http.MethodGet, url, nil) if err != nil { log.Fatal(err) } res, getErr := testClient.Do(req) if getErr != nil { log.Fatal(getErr) } body, readErr := ioutil.ReadAll(res.Body) if readErr != nil { log.Fatal(readErr) } svc1 := svc{} jsonErr := json.Unmarshal(body, &svc1) if jsonErr != nil { log.Fatal(jsonErr) } fmt.Println(svc1.Ip) }
如果有人可以向我提示我需要添加到代码中以获得“ ip”值的提示,我将不胜感激。
您可以创建结构来模仿json结构,然后对json进行解码。
package main import ( "bytes" "encoding/json" "fmt" "log" ) type Example struct { Type string `json:"type,omitempty"` Subsets []Subset `json:"subsets,omitempty"` } type Subset struct { Addresses []Address `json:"addresses,omitempty"` } type Address struct { IP string `json:"IP,omitempty"` } func main() { m := []byte(`{"type":"example","data": {"name": "abc","labels": {"key": "value"}},"subsets": [{"addresses": [{"ip": "192.168.103.178"}],"ports": [{"port": 80}]}]}`) r := bytes.NewReader(m) decoder := json.NewDecoder(r) val := &Example{} err := decoder.Decode(val) if err != nil { log.Fatal(err) } // If you want to read a response body // decoder := json.NewDecoder(res.Body) // err := decoder.Decode(val) // Subsets is a slice so you must loop over it for _, s := range val.Subsets { // within Subsets, address is also a slice // then you can access each IP from type Address for _, a := range s.Addresses { fmt.Println(a.IP) } } }
输出为: 192.168.103.178
192.168.103.178
通过将其解码为一个结构,您可以循环遍历任何切片,而不会局限于一个IP
这里的例子:
https://play.golang.org/p/sWA9qBWljA