Estoy tratando de leer datos JSON de la web, pero ese código devuelve un resultado vacío. No estoy seguro de qué estoy haciendo mal aquí.
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 } }
incluso cuando los parámetros reales en el JSON que está analizando están en minúsculas. Ejemplo de JSON:{ "keys": [{ "x5t": "foo", "x5c": "baaaar" }] }
&http.Client{Timeout: 10 * time.Second}
o usar otra biblioteca / estrategia?json.NewDecoder(r.Body).Decode(target)
se no devolverá un error para ciertos tipos de JSON malformación! Simplemente perdí unas horas tratando de entender por qué seguía recibiendo una respuesta vacía; resulta que la fuente JSON tenía una coma adicional donde no debería haber estado. Te sugiero que usesjson.Unmarshal
en su lugar. También hay una buena reseña sobre otros peligros potenciales de usarjson.Decoder
aquíSu problema fueron las declaraciones de sectores en sus datos
structs
(exceptoTrack
que no deberían ser sectores ...). Esto se vio agravado por algunos nombres de campo bastante tontos en el archivo json recuperado, que se puede arreglar a través de estructuras, ver godoc .El siguiente código analizó el json con éxito. Si tiene más preguntas, hágamelo saber.
fuente
Necesita nombres de propiedad en mayúsculas en sus estructuras para ser utilizados por los paquetes json.
Los nombres de propiedad en mayúsculas son
exported properties
. Los nombres de propiedad en minúsculas no se exportan.También debe pasar el objeto de datos por referencia (
&data
).fuente
Los resultados de
json.Unmarshal
(intovar data interface{}
) no coinciden directamente con su tipo de Go y las declaraciones de variables. Por ejemplo,Salida:
fuente