当前位置: 首页 > 面试题库 >

如何从http.Get获取JSON响应

谢嘉
2023-03-14
问题内容

我正在尝试从Web读取JSON数据,但是该代码返回空结果。我不确定我在做什么错。

package main

import "os"
import "fmt"
import "net/http"
import "io/ioutil"
import "encoding/json"

type Tracks struct {
    Toptracks []Toptracks_info
}

type Toptracks_info struct {
    Track []Track_info
    Attr  []Attr_info
}

type Track_info struct {
    Name       string
    Duration   string
    Listeners  string
    Mbid       string
    Url        string
    Streamable []Streamable_info
    Artist     []Artist_info
    Attr       []Track_attr_info
}

type Attr_info struct {
    Country    string
    Page       string
    PerPage    string
    TotalPages string
    Total      string
}

type Streamable_info struct {
    Text      string
    Fulltrack string
}

type Artist_info struct {
    Name string
    Mbid string
    Url  string
}

type Track_attr_info struct {
    Rank string
}

func get_content() {
    // json data
    url := "http://ws.audioscrobbler.com/2.0/?method=geo.gettoptracks&api_key=c1572082105bd40d247836b5c1819623&format=json&country=Netherlands"

    res, err := http.Get(url)

    if err != nil {
        panic(err.Error())
    }

    body, err := ioutil.ReadAll(res.Body)

    if err != nil {
        panic(err.Error())
    }

    var data Tracks
    json.Unmarshal(body, &data)
    fmt.Printf("Results: %v\n", data)
    os.Exit(0)
}

func main() {
    get_content()
}

问题答案:

理想的方法 不是
使用ioutil.ReadAll,而是直接在阅读器上使用解码器。这是一个不错的函数,它获取url并将其响应解码到target结构上。

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)
}

使用示例:

type Foo struct {
    Bar string
}

func main() {
    foo1 := new(Foo) // or &Foo{}
    getJson("http://example.com", foo1)
    println(foo1.Bar)

    // alternately:

    foo2 := Foo{}
    getJson("http://example.com", &foo2)
    println(foo2.Bar)
}

您不应该*http.Client在生产中使用默认结构,如最初回答的那样!(http.Get/
etc调用的是哪个)。原因是默认客户端没有设置超时。如果远程服务器无响应,那将是糟糕的一天。



 类似资料:
  • 我正在尝试从json的响应中获取正文并打印这个json或能够将他放入数组。我在堆栈上找到了这篇文章:如何从http.Get获得JSON响应。有代码: 但是我不明白为什么会有“Decode(target)”和“target interface{}”。它是做什么的?为什么当我试着打印json时?NewDecoder(r.Body)没有什么有意义的。

  • 我一直在努力学习关于如何使用的最简单的教程,我认为这是与相比的下一个最棒的教程。 例如,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序列化程序。 但是,这适用于复杂类型,但字符串没有任何区别。

  • 我使用Spring设置,使用json映射转换器将POJO类作为json发送回客户端。 例如。: 这将返回例如类似于客户端的内容: 我想截取所有控制器操作,将json包装成如下内容: 最好的方法是什么?

  • 我需要用函数SSJS from mJson()读一个URL。例如Notes View的数据访问API http://{host}/{database}/api/data/collections/name/{name} 我该怎么做? P. S我认为(我不知道是否是真的),如果我使用Java代码(例如类URLReader从这个博客,我失去作者/读者的功能,因为是我的服务器,而不是当前用户执行读取流?