我是golang的新手。我正在编写一个程序来解析API的json响应:https://httpbin.org/get。我已经使用以下代码来解析响应:
package main
import (
"encoding/json"
"fmt"
"net/http"
"os"
)
type Headers struct {
Close string `json:"Connection"`
Accept string `json:"Accept"`
}
type apiResponse struct {
Header Headers `json:"headers"`
URL string `json:"url"`
}
func main() {
apiRoot := "https://httpbin.org/get"
req, err := http.NewRequest("GET", apiRoot, nil)
if err != nil {
fmt.Println("Couldn't prepare request")
os.Exit(1)
}
response, err := http.DefaultClient.Do(req)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
defer response.Body.Close()
var responseStruct apiResponse
err = json.NewDecoder(response.Body).Decode(&responseStruct)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
fmt.Printf("%v\n", responseStruct)
}
运行此代码时,输出为:
$ go run parse.go
{{close } https://httpbin.org/get}
从输出中,我们可以看到json响应中的“ Accept”键未解码。为什么会这样呢?如何从响应正文中解析该字符串?
答案 0 :(得分:1)
您的代码运行良好,但是在这里我认为您的Accept
键没有从API返回,这就是为什么它不显示Accept
值。要检查结构中的key
,value
对,请使用下面的print
方法。
fmt.Printf("%+v\n", responseStruct)
要克服这种情况,您需要先将Accept
和请求一起发送到header
,然后再请求API,例如:
req.Header.Set("Accept", "value")
response, err := hc.Do(req)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
然后您将在Accept
结构中获得decoded
值,如下所示:
{Header:{Accept:value Close:close} URL:https://httpbin.org/get}
答案 1 :(得分:0)
apiResponse未导出-您需要将其更改为类似APIResponse的名称。您可能会发现将要解码的JSON粘贴到https://mholt.github.io/json-to-go/中就可以制作出所需的所有代码!
type AutoGenerated struct {
Args struct {
} `json:"args"`
Headers struct {
Accept string `json:"Accept"`
AcceptEncoding string `json:"Accept-Encoding"`
AcceptLanguage string `json:"Accept-Language"`
Connection string `json:"Connection"`
Dnt string `json:"Dnt"`
Host string `json:"Host"`
UpgradeInsecureRequests string `json:"Upgrade-Insecure-Requests"`
UserAgent string `json:"User-Agent"`
} `json:"headers"`
Origin string `json:"origin"`
URL string `json:"url"`
}