Estou tentando ler dados JSON da web, mas esse código retorna resultado vazio. Não tenho certeza do que estou fazendo de errado aqui.
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()
}
type WebKeys struct { Keys []struct { X5t string X5c []string } }
mesmo quando os parâmetros reais no JSON que você está analisando estão em letras minúsculas. Exemplo de JSON:{ "keys": [{ "x5t": "foo", "x5c": "baaaar" }] }
&http.Client{Timeout: 10 * time.Second}
ou usar uma outra biblioteca / estratégia inteira?json.NewDecoder(r.Body).Decode(target)
vai não retornar um erro para determinados tipos de JSON malformada! Eu perdi algumas horas tentando entender por que continuava recebendo uma resposta vazia - a fonte JSON tinha uma vírgula extra onde não deveria estar. Eu sugiro que você usejson.Unmarshal
. Há também um bom writeup sobre outros perigos potenciais do usojson.Decoder
aquiSeu problema foram as declarações de fatia nos seus dados
structs
(excetoTrack
, não devem ser fatias ...). Isso foi composto por alguns nomes de campo bastante engraçados no arquivo json buscado, que pode ser corrigido via structtags, veja godoc .O código abaixo analisou o json com êxito. Se tiver mais perguntas, entre em contato.
fonte
Você precisa de nomes de propriedades em maiúsculas em suas estruturas para ser usado pelos pacotes json.
Os nomes de propriedades em maiúsculas são
exported properties
. Nomes de propriedades em minúsculas não são exportados.Você também precisa passar o objeto de dados por referência (
&data
).fonte
Os resultados de
json.Unmarshal
(paravar data interface{}
) não correspondem diretamente ao seu tipo Go e às declarações de variáveis. Por exemplo,Resultado:
fonte