gpt4 book ai didi

json - 使用 golang 解析 JSON HTTP 响应

转载 作者:IT王子 更新时间:2023-10-29 01:16:39 25 4
gpt4 key购买 nike

我正在尝试从以下 curl 输出中获取 say“ip”的值:

{  
"type":"example",
"data":{
"name":"abc",
"labels":{
"key":"value"
}
},
"subsets":[
{
"addresses":[
{
"ip":"192.168.103.178"
}
],
"ports":[
{
"port":80
}
]
}
]
}

我在互联网上找到了很多解析 curl 请求的 json 输出的例子,我写了下面的代码,但这似乎并没有返回 say "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)
}

如果有人可以向我提供提示,说明我需要向我的代码中添加什么以获得 say“ip”的值,我将不胜感激。

最佳答案

您可以创建反射(reflect)您的 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

通过将其解码为一个结构,您可以遍历任何 slice ,而不是将自己限制在一个 IP 上

这里的例子:

https://play.golang.org/p/sWA9qBWljA

关于json - 使用 golang 解析 JSON HTTP 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45756011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com