Ich versuche, JSON-Daten aus dem Web zu lesen, aber dieser Code gibt ein leeres Ergebnis zurück. Ich bin mir nicht sicher, was ich hier falsch mache.
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 } }
selbst wenn die tatsächlichen Parameter in dem JSON, den Sie analysieren, in Kleinbuchstaben geschrieben sind. JSON Beispiel:{ "keys": [{ "x5t": "foo", "x5c": "baaaar" }] }
&http.Client{Timeout: 10 * time.Second}
eine ganz andere Bibliothek / Strategie verwenden oder verwenden sollte ?json.NewDecoder(r.Body).Decode(target)
gibt keinen Fehler für bestimmte Arten von fehlerhaftem JSON zurück! Ich habe nur ein paar Stunden damit verbracht zu verstehen, warum ich immer wieder eine leere Antwort erhielt - es stellte sich heraus, dass die Quelle JSON ein zusätzliches Komma hatte, wo es nicht hätte sein sollen. Ich schlage vor, Sie verwendenjson.Unmarshal
stattdessen. Es gibt auch eine gute Zusammenfassung über andere mögliche Gefahren der Verwendungjson.Decoder
hierIhr Problem waren die Slice-Deklarationen in Ihren Daten
structs
(außerTrack
, sie sollten keine Slices sein ...). Dies wurde durch einige ziemlich doofe Feldnamen in der abgerufenen json-Datei verstärkt, die über Strukturtags behoben werden können, siehe godoc .Der folgende Code hat den JSON erfolgreich analysiert. Wenn Sie weitere Fragen haben, lassen Sie es mich wissen.
quelle
Sie benötigen Eigenschaftsnamen in Großbuchstaben in Ihren Strukturen, um von den json-Paketen verwendet zu werden.
Eigenschaftsnamen in Großbuchstaben sind
exported properties
. Eigenschaftsnamen in Kleinbuchstaben werden nicht exportiert.Sie müssen das Datenobjekt auch als Referenz übergeben (
&data
).quelle
Die Ergebnisse von
json.Unmarshal
(invar data interface{}
) stimmen nicht direkt mit Ihren Go-Typ- und Variablendeklarationen überein. Beispielsweise,Ausgabe:
quelle