Maison >développement back-end >Golang >Passez au JSON Unmarshalling : structures ou interfaces – Quand utiliser des pointeurs ?
Désorganisation de JSON en structures ou en interfaces
Dans Go, le package encoding/json fournit des fonctionnalités permettant de convertir des données JSON vers et depuis des valeurs Go . Lors de la désorganisation de JSON dans une structure, il est important de comprendre que le package nécessite des instructions explicites sur le type de cible.
Par défaut, lors de la désorganisation de JSON dans une interface, le package sélectionne un type approprié en fonction de la structure des données. Pour les objets JSON, il choisit map[string]interface{} et pour les tableaux JSON, il sélectionne []interface{}. Cependant, ce comportement diffère lorsqu'il s'agit de structures.
Pour désorganiser JSON dans une structure spécifique, vous devez passer un pointeur vers la structure comme deuxième paramètre de json.Unmarshal(). En effet, Go déréférence automatiquement les pointeurs lorsqu'ils les transmettent à des fonctions.
Cependant, si vous tentez de désorganiser JSON dans une variable d'interface{} contenant une valeur de structure non-pointeur, le package n'a aucun moyen de déterminer la valeur de structure prévue. type de cible. Au lieu de cela, il interprétera les données comme une carte ou une tranche, en fonction de sa structure.
Pour résoudre ce problème, vous devez envelopper la valeur de votre structure dans une interface{} à l'aide d'une référence de pointeur. Cela garantit que json.Unmarshal dispose des informations nécessaires pour désorganiser le type approprié :
func getFoo() interface{} { return &Foo{"bar"} // Use a pointer wrapper }
Voici une version améliorée de l'exemple de code :
package main import ( "encoding/json" "fmt" ) type Foo struct { Bar string `json:"bar"` } func getFoo() interface{} { return &Foo{"bar"} } func main() { fooInterface := getFoo() myJSON := `{"bar":"This is the new value of bar"}` jsonBytes := []byte(myJSON) err := json.Unmarshal(jsonBytes, fooInterface ) if err != nil { fmt.Println(err) } fmt.Printf("%T %+v", fooInterface, fooInterface) }
Ce code mis à jour s'imprimera avec succès la structure Foo non marshalée avec la valeur "bar" mise à jour.
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!