J'essaie de lire les données JSON à partir du Web, mais ce code renvoie un résultat vide. Je ne sais pas ce que je fais de mal ici.
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 } }
même lorsque les paramètres réels du JSON que vous analysez sont en minuscules. Exemple JSON:{ "keys": [{ "x5t": "foo", "x5c": "baaaar" }] }
&http.Client{Timeout: 10 * time.Second}
ou utiliser une toute autre bibliothèque / stratégie?json.NewDecoder(r.Body).Decode(target)
ne pas renvoyer une erreur pour certains types de malformé JSON! J'ai juste perdu quelques heures à essayer de comprendre pourquoi je n'arrêtais pas de recevoir une réponse vide - il s'avère que le JSON source avait une virgule supplémentaire là où il n'aurait pas dû être. Je vous suggère d'utiliser à lajson.Unmarshal
place. Il y a aussi un bon article sur les autres dangers potentiels de l'utilisationjson.Decoder
iciVotre problème était les déclarations de tranches dans vos données
structs
(saufTrack
qu'elles ne devraient pas être des tranches ...). Cela a été aggravé par des noms de champ plutôt loufoques dans le fichier json récupéré, qui peuvent être corrigés via des structtags, voir godoc .Le code ci-dessous a analysé le json avec succès. Si vous avez d'autres questions, faites-le moi savoir.
la source
Vous avez besoin de noms de propriétés en majuscules dans vos structures pour être utilisés par les packages json.
Les noms de propriété en majuscules sont
exported properties
. Les noms de propriété en minuscules ne sont pas exportés.Vous devez également transmettre votre objet de données par reference (
&data
).la source
Les résultats de
json.Unmarshal
(intovar data interface{}
) ne correspondent pas directement à votre type de Go et à vos déclarations de variables. Par exemple,Production:
la source