2017-06-05 110 views
0

我试图用golang读取json文件,但是我收到了这个错误。 我已经检查了几乎所有关于它的问题,但仍然无法得到它。json:can not unmarshal array Go类型的值main.Posts

这里的例子JSON文件: https://jsonplaceholder.typicode.com/posts

而且我的代码:

package main 

import (
    "net/http" 
    "log" 
    "fmt" 
    "io/ioutil" 
    "encoding/json" 
) 

type Posts struct { 
    Post []struct{ 
     UserId int `json:"userId"` 
     ID int `json:"id"` 
     Title string `json:"title"` 
     Body string `json:"body"` 
    } 
} 

func main(){ 
    resp, err := http.Get("https://jsonplaceholder.typicode.com/posts") 

    if err != nil { 
     log.Fatal(err) 
    } 

    content, _ := ioutil.ReadAll(resp.Body) 

    var posts Posts 

    parsed := json.Unmarshal([]byte(content), &posts) 

    //fmt.Println(string(content)) 

    fmt.Println(parsed) 

} 

回答

1

帖子是邮政的阵列结构,但你定义为后阵是你的第一个错误,也解组没有返回结果它只返回错误并填充给定的参数。

package main 

import (
    "net/http" 
    "log" 
    "fmt" 
    "io/ioutil" 
    "encoding/json" 
) 

type Post struct { 
     UserId int `json:"userId"` 
     ID int `json:"id"` 
     Title string `json:"title"` 
     Body string `json:"body"` 
} 

type Posts []Post 


func main(){ 
    resp, err := http.Get("https://jsonplaceholder.typicode.com/posts") 

    if err != nil { 
     log.Fatal(err) 
    } 

    content, _ := ioutil.ReadAll(resp.Body) 

    var posts Posts 

    err = json.Unmarshal(content, &posts) 

    if err != nil { 
     log.Fatal(err) 
    } 


    fmt.Println(posts[0].Body) 

} 
3

即JSON是,在它的根,一个数组。您试图将它解组到一个对象中,该对象包含一个数组作为字段 - 因此,当JSON是一个数组时,您传递了一个对象的错误。你想传递一个数组(或切片,真的),如:

type Post struct { 
    UserId int `json:"userId"` 
    ID int `json:"id"` 
    Title string `json:"title"` 
    Body string `json:"body"` 
} 

//... 

var posts []Post 
err := json.Unmarshal([]byte(content), &posts) 

// Check err, do stuff with posts