Json 解析RESTAPI响应

Json 解析RESTAPI响应,json,parsing,go,Json,Parsing,Go,我是刚来戈朗的。我正在编写一个程序来解析API的json响应:。我使用了以下代码来解析响应: package main import ( "encoding/json" "fmt" "net/http" "os" ) type Headers struct { Close string `json:"Connection"` Accept string `json:"Accept"` } type apiResponse struct {

我是刚来戈朗的。我正在编写一个程序来解析API的json响应:。我使用了以下代码来解析响应:

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”键没有被解码。为什么会这样?如何从响应体解析该字符串?

您的代码运行良好,但我认为您的
Accept
键没有从API返回,这就是它没有显示
Accept
值的原因。要检查结构的
对,请使用下面的
打印
方法

fmt.Printf("%+v\n", responseStruct)
要克服这种情况,您需要在请求之前将带有请求的
接受
发送到
标题中,如:

然后,您将在
decoded
struct中获得
Accept
值,如下所示:

{Header:{Accept:value Close:close} URL:https://httpbin.org/get}

apiResponse未报告-您需要将其更改为类似apiResponse的内容。您可能会发现,粘贴您想要解码的JSON将生成您需要的所有代码

类型自动生成的结构{
Args结构{
}`json:“args”`
标题结构{
Accept字符串`json:“Accept”`
AcceptEncoding字符串`json:“接受编码”`
AcceptLanguage字符串`json:“接受语言”`
连接字符串`json:“连接”`
Dnt字符串`json:“Dnt”`
主机字符串`json:“主机”`
UpgradeUnsecureRequests字符串`json:“升级不安全请求”`
UserAgent字符串`json:“用户代理”`
}`json:“标题”`
Origin字符串`json:“Origin”`
URL字符串`json:“URL”`
}

在本地运行代码时,响应不包含Accept值。@萨达姆:我已经打印了它,但它不包含Accept。它显示
{Header:{Accept:Close:Close}URL:https://httpbin.org/get}
@Arun您从httpbin收到的响应不包含Accept,因为您没有发送Accept标头。发送一个,你就会得到一个。标题不是正文的一部分。它们已经被“预读”并解析为
http.Repsonse.Header
@mkopriva:它不是headers,这里显示的内容来自响应的主体。您可以通过postman@Arun响应是您发送到URL的请求头的反映。您的浏览器发送的标题与Go http客户端不同。@Not_a_Golfer:我理解这种情况。我已将标题设置为与浏览器相同,并获得了结果。@Arun我的错,我误读了您的问题。我认为未报告的apiResponse不是问题,因为我是从同一文件调用它的。感谢您提供了到
json to go
工具的链接。正确-json包需要导出成员才能获取它们。显示只要API返回预期的头,代码就可以正常工作。
{Header:{Accept:value Close:close} URL:https://httpbin.org/get}