当前位置: 首页 > 知识库问答 >
问题:

如何从http.get获取JSON响应体

乌学博
2023-03-14

我正在尝试从json的响应中获取正文并打印这个json或能够将他放入数组。我在堆栈上找到了这篇文章:如何从http.Get获得JSON响应。有代码

var myClient = &http.Client{Timeout: 10 * time.Second}

func getJson(url string, target interface{}) error {
    r, err := myClient.Get(url)
    if err != nil {
        return err
    }
    defer r.Body.Close()

    return json.NewDecoder(r.Body).Decode(target)
}

但是我不明白为什么会有“Decode(target)”和“target interface{}”。它是做什么的?为什么当我试着打印json时?NewDecoder(r.Body)没有什么有意义的。

共有2个答案

姚海
2023-03-14

这里有一个例子:

package main

import (
   "encoding/json"
   "net/http"
)

func main() {
   r, e := http.Get("https://github.com/manifest.json")
   if e != nil {
      panic(e)
   }
   defer r.Body.Close()
   var s struct { Name string }
   json.NewDecoder(r.Body).Decode(&s)
   println(s.Name == "GitHub")
}

https://golang.org/pkg/encoding/json#Decoder.Decode

廖招
2023-03-14

问题中的函数 getJson 将指定 URL 的 JSON 响应正文解码为目标所指向的值。表达式 json。NewDecoder(r.Body).解码(目标)执行以下操作:

  • 创建从响应正文读取的解码器
  • 使用解码器将 JSON 取消发送到目标指向的值。
  • 返回错误或 nil。

下面是该函数的一个使用示例。程序获取并打印关于这个答案的信息。

func main() {
    url := "https://api.stackexchange.com/2.2/answers/67655454?site=stackoverflow"

    // Answers is a type the represents the JSON for a SO answer.
    var response Answers

    // Pass the address of the response to getJson. The getJson passes
    // that address on to the JSON decoder.
    err := getJson(url, &response)

    // Check for errors. Adjust error handling to match the needs of your
    // application.
    if err != nil {
        log.Fatal(err)
    }

    // Print the answer.
    for _, item := range response.Items {
        fmt.Printf("%#v", item)
    }
}

type Owner struct {
    Reputation   int    `json:"reputation"`
    UserID       int    `json:"user_id"`
    UserType     string `json:"user_type"`
    AcceptRate   int    `json:"accept_rate"`
    ProfileImage string `json:"profile_image"`
    DisplayName  string `json:"display_name"`
    Link         string `json:"link"`
}

type Item struct {
    Owner            *Owner `json:"owner"`
    IsAccepted       bool   `json:"is_accepted"`
    Score            int    `json:"score"`
    LastActivityDate int    `json:"last_activity_date"`
    LastEditDate     int    `json:"last_edit_date"`
    CreationDate     int    `json:"creation_date"`
    AnswerID         int    `json:"answer_id"`
    QuestionID       int    `json:"question_id"`
    ContentLicense   string `json:"content_license"`
}

type Answers struct {
    Items          []*Item `json:"items"`
    HasMore        bool    `json:"has_more"`
    QuotaMax       int     `json:"quota_max"`
    QuotaRemaining int     `json:"quota_remaining"`
}

链接到完整的代码,包括来自问题的代码。

 类似资料:
  • 问题内容: 我正在尝试从Web读取JSON数据,但是该代码返回空结果。我不确定我在做什么错。 问题答案: 理想的方法 不是 使用,而是直接在阅读器上使用解码器。这是一个不错的函数,它获取url并将其响应解码到结构上。 使用示例: 您不应该在生产中使用默认结构,如最初回答的那样!(/ etc调用的是哪个)。原因是默认客户端没有设置超时。如果远程服务器无响应,那将是糟糕的一天。

  • 我一直在努力学习关于如何使用的最简单的教程,我认为这是与相比的下一个最棒的教程。 例如,https://www.baeldung.com/spring-5-webclient#4-geting-a-response 因此,当我尝试对https://petstore.swagger.io/v2/pet/findbystatus?status=available执行同样的操作时,

  • 我试图从Web读取JSON数据,但该代码返回空结果。我不确定我做错了什么。

  • 问题内容: 我有以下方法: 在这里,我将ResponseFormat属性设置为json,但仍将其作为XML返回。 我想使用此asmx服务进行json格式化有什么想法吗? 问题答案: 我遇到了同样的问题,并包含以下代码以使其正常工作。 更新: 要获得纯json格式,您可以使用如下的javascript序列化程序。 但是,这适用于复杂类型,但字符串没有任何区别。

  • 问题内容: 我想从Http get响应中获取一个对象: 这是我当前对Http get的代码: 这是convertSteamToString函数: 现在,我只是得到一个字符串对象。我如何找回JSON对象。 问题答案: 您获得的字符串只是JSON Object.toString()。这意味着您将获取JSON对象,但使用String格式。 如果应该获取JSON对象,则可以输入: