Zugriff auf tief verschachtelte JSON-Schlüssel und -Werte in Go
Betrachten Sie den folgenden in Go geschriebenen Websocket-Client-Code:
import ( "encoding/json" "log" ) func main() { msg := `{"args":[{"time":"2013-05-21 16:56:16", "tzs":[{"name":"GMT"}]}],"name":"send:time"}` var u map[string]interface{} err := json.Unmarshal([]byte(msg), &u) if err != nil { log.Fatalf("Failed to unmarshal: %v\n", err) } args := u["args"] // Attempting to directly access the time key will throw an error log.Println(args[0]["time"]) // invalid notation }
In diesem Szenario tritt der Fehler „ungültige Operation: args[0] (Index vom Typ Schnittstelle {})“ aufgrund einer falschen Notation beim Zugriff auf den tief verschachtelten „Zeit“-Schlüssel auf.
Lösung
Eine empfohlene Lösung ist die Verwendung des Pakets github.com/bitly/go-simplejson, das die Navigation in JSON-Datenstrukturen vereinfacht. Weitere Informationen finden Sie in der Dokumentation unter http://godoc.org/github.com/bitly/go-simplejson.
Anwenden dieses Pakets auf den obigen Code:
// Import go-simplejson import "github.com/bitly/go-simplejson" func main() { // Create a JSON object json := simplejson.New() json.Decode([]byte(msg)) // Using go-simplejson, access the time key time, err := json.Get("args").GetIndex(0).String("time") if err != nil { log.Fatalf("Failed to get time: %v\n", err) } log.Println(time) // Returns the time value }
Bezüglich der Im zweiten Teil der ursprünglichen Frage würde die Deklaration einer Go-Struktur benutzerdefinierte Marshaller und Unmarshaler erfordern, was die Implementierung der Schnittstellen „encoding.TextMarshaler“ und „encoding.TextUnmarshaler“ beinhaltet. Die Verwendung einer JSON-Bibliothek wie go-simplejson vereinfacht diesen Prozess jedoch.
Das obige ist der detaillierte Inhalt vonWie kann ich in Go auf tief verschachtelte JSON-Schlüssel und -Werte zugreifen, ohne benutzerdefinierte Marshaller und Unmarshaler zu verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!