2017-01-23 5 views
-1

Ich bin neu in Golang und ich versuche, große json wie diejenigen zu analysieren, die Sie von einer API erhalten, die viele Daten haben. Die documentation erläutert, wie dies zu tun, mit jedem json:Wie man riesige json in Golang analysieren

b := []byte(`{"Name":"Wednesday","Age":6,"Parents":["Gomez","Morticia"]}`) 
var f interface{} 
err := json.Unmarshal(b, &f) 
m := f.(map[string]interface{}) 

Dies funktioniert gut, aber wenn ich eine json verwenden, die ich von dem Twitter-API zu erhalten, wie am Ende der Referenz auf den Twitter dev site ich dieser Fehler:

interface conversion: interface {} is []interface {}, not map[string]interface {}

ich weiß, dass es ähnliche Fragen, aber ich konnte keine Antwort finden. Kann mir jemand den besseren Weg empfehlen, das zu lösen?

Meine Go-Version go1.6.2 Linux/AMD64.

Danke!

Antwort

2

In diesem Fall entmapseln Sie kein einzelnes JSON-Objekt, sondern ein Array von JSON-Objekten, weshalb bei der API-Antwort ein Problem auftritt. Der Fehler, den Sie sehen, sagt Ihnen den tatsächlichen Typ von f. Das andere Beispiel funktionierte, weil es sich um ein einzelnes JSON-Objekt ist, das als ein map[string]interface{} Werfen Sie einen Blick auf diese abgebildet werden können:

var f []interface{} 
err := json.Unmarshal(str, &f) 
if err != nil { 
    fmt.Println(err) 
    return 
} 

for _, v := range f { 
    z := v.(map[string]interface{}) 
    for k2, v2 := range z { 
     fmt.Println("Key:", k2, "Value:", v2) 
    } 
} 

f vom Typ []interface{} eine Reihe von Schnittstellen sein sollte. Abhängig davon, wie Sie die API-Antwort parsen, können Sie etwas tun, wie ich es in der for-Schleife mache, um jedes Schlüssel-Wert-Paar darzustellen.

+0

Vielen Dank, das funktioniert gut und verzeih mir für eine so dumme Frage. –