Golang:如何解析/解组/解码一个json数组API响应?

问题描述:

我试图解析来自*的API位于https://wikimedia.org/api/rest_v1/metrics/pageviews/per-article/en.wikipedia.org/all-access/all-agents/Smithsonian_Institution/daily/20160101/20170101到结构,其中我将进行打印出图的阵列响应数Golang:如何解析/解组/解码一个json数组API响应?

不过,我曾试图为了达到这个实现的代码当我构建并运行它时,终端中什么都不会返回?

我没有成功的代码如下。

type Post struct { 
    Project string `json:"project"` 
    Article string `json:"article"` 
    Granularity string `json:"granularity"` 
    Timestamp string `json:"timestamp"` 
    Access string `json:"access"` 
    Agent string `json:"agent"` 
    Views int `json:"views"` 
} 

func main(){ 
    //The name of the wikipedia post 
    postName := "Smithsonian_Institution" 

    //The frequency of 
    period := "daily" 

    //When to start the selection 
    startDate := "20160101" 

    //When to end the selection 
    endDate := "20170101" 

    url := fmt.Sprintf("https://wikimedia.org/api/rest_v1/metrics/pageviews/per-article/en.wikipedia.org/all-access/all-agents/%s/%s/%s/%s", postName, period, startDate, endDate) 

    //Get from URL 
    req, err := http.Get(url) 
    if err != nil{ 
     return 
    } 
    defer req.Body.Close() 

    var posts []Post 

    body, err := ioutil.ReadAll(req.Body) 
    if err != nil { 
     panic(err.Error()) 
    } 

    json.Unmarshal(body, &posts) 

    // Loop over structs and display the respective views. 
    for p := range posts { 
     fmt.Printf("Views = %v", posts[p].Views) 
     fmt.Println() 
    } 

} 

什么是接收来自API的JSON响应如上述和此后提到解析该阵列分成结构,其然后可被插入到数据存储或相应地打印出的阵列的一个的最佳方法。

谢谢

您的解决方案:

data := struct { 
    Items []struct { 
     Project string `json:"project"` 
     Article string `json:"article"` 
     Granularity string `json:"granularity"` 
     Timestamp string `json:"timestamp"` 
     Access string `json:"access"` 
     Agent string `json:"agent"` 
     Views int `json:"views"` 
    } `json:"items"` 
}{} 

// you don't need to convert body to []byte, ReadAll returns []byte 

err := json.Unmarshal(body, &data) 
if err != nil { // don't forget handle errors 
} 
+1

感谢您的回答。它非常完美! –

结构声明可以互相嵌套。

下面的结构应该是可转换从JSON:

type resp struct { 
    Items []struct { 
     Project string `json:"project"` 
     Article string `json:"article"` 
     Granularity string `json:"granularity"` 
     Timestamp string `json:"timestamp"` 
     Access string `json:"access"` 
     Agent string `json:"agent"` 
     Views int `json:"views"` 
    } `json:"items"` 
} 

我产生随着json-to-go这是一个伟大的节省时间与JSON API的工作时。

+0

这JSON到去是一个真正的救星。谢谢! –