Maison >développement back-end >Golang >Comment puis-je accéder à des clés et valeurs JSON profondément imbriquées dans Go sans utiliser de marshaleurs et de démarshaleurs personnalisés ?
Accès aux clés et valeurs JSON profondément imbriquées dans Go
Considérez le code client websocket suivant écrit en Go :
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 }
Dans ce scénario, l'erreur « opération invalide : args[0] (index de type interface {}) » se produit en raison d'une notation incorrecte lors de l'accès à la clé « time » profondément imbriquée.
Solution
Une solution recommandée consiste à utiliser le package github.com/bitly/go-simplejson, qui simplifie la navigation dans les structures de données JSON. Reportez-vous à la documentation sur http://godoc.org/github.com/bitly/go-simplejson pour plus de détails.
Application de ce package au code ci-dessus :
// 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 }
Concernant le deuxième partie de la question d'origine, déclarer une structure Go nécessiterait des marshaleurs et des démarshalers personnalisés, ce qui implique l'implémentation des interfaces encoding.TextMarshaler et encoding.TextUnmarshaler. Cependant, l'utilisation d'une bibliothèque JSON comme go-simplejson simplifie ce processus.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!