Maison  >  Article  >  développement back-end  >  ## Pourquoi `json.Unmarshal` renvoie-t-il une carte au lieu d'une structure lors du démarshaling dans une interface{} ?

## Pourquoi `json.Unmarshal` renvoie-t-il une carte au lieu d'une structure lors du démarshaling dans une interface{} ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-26 06:24:02246parcourir

## Why does `json.Unmarshal` return a map instead of a struct when unmarshaling into an interface{}?

Type de retour anormal de l'interface de marshaling avec JSON

Dans les scénarios où json.Unmarshal est utilisé pour convertir un tableau d'octets en une interface{}, un résultat inattendu peut survenir lorsqu'une carte est renvoyée au lieu du type de structure prévu. Cet écart peut être attribué à la nature abstraite du type interface{}, laissant le package json incapable de discerner la structure struct sous-jacente.

Pour rectifier cette anomalie, il est recommandé de passer explicitement un pointeur vers le type souhaité. struct, en le transformant en interface abstraite. Cette approche permet au package json de reconnaître et de désérialiser la structure en conséquence.

Par exemple, l'extrait de code modifié suivant illustre le comportement souhaité :

<code class="go">func bad() {
    var ping interface{} = &Ping{} // Pass a pointer to Ping as an interface
    deserialize([]byte(`{"id":42}`), ping)
    fmt.Println("DONE:", ping) // Now outputs a Ping struct
}</code>

Alternativement, si l'accès à un pointeur est n'est pas réalisable, l'allocation dynamique peut être utilisée pour créer un nouveau pointeur pouvant être désérialisé. La valeur originale de l'interface{} peut ensuite être mise à jour avec la nouvelle valeur.

<code class="go">func bad() {
    var ping interface{} = Ping{}
    nptr := reflect.New(reflect.TypeOf(ping))
    deserialize([]byte(`{"id":42}`), nptr.Interface())
    ping = nptr.Interface()
    fmt.Println("DONE:", ping) // Outputs a Ping struct
}</code>

En employant l'une de ces techniques, la fonction json.Unmarshal peut désérialiser avec précision le tableau d'octets dans le type de structure souhaité, éliminant ainsi le valeur de retour de carte inattendue.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn