【发布时间】:2018-01-27 02:27:44
【问题描述】:
我正在尝试从以下 curl 输出中获取 say "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)
}
如果有人能提示我需要添加到我的代码中以获得say“ip”的值,我将不胜感激。
【问题讨论】:
-
您的 json 无效。您在
ip正下方有一个额外的},以及两个对象的最后一项(在80和之后)的逗号(,)"192.168.103.178")。您可以使用任何在线 json 格式化程序/验证程序来帮助您构建有效的 json - 只需 google 一下,您就会发现几个选项。 -
对不起
ip下面的额外括号和额外的逗号只是复制和粘贴错误;实际的卷曲输出非常大,因此为了这个问题不得不缩短它。我现在已经在问题中解决了它。 -
您的
struct与 JSON 输入的结构不匹配。您正在尝试反序列化一个大型数据结构,其中ip字段深深嵌套在数组中,成为单个对象,其中包含一个包含单个值的顶级字段 - 如果subsets或 @ 中有多个项目怎么办987654332@?它怎么知道subsets[n].addresses[m].ip应该映射到.ip? -
您似乎也将
curlLinux 实用程序与 Go 的http.Client混淆了。它们根本不是一回事。 -
@Adrian 是的,你是对的,在实际 curl 输出中的地址下有多个项目,但我感兴趣的是子集 [n].addresses[m].ip 将始终映射到知识产权。