Maison > développement back-end > Golang > le corps du texte

Comment désorganiser JSON dans une structure spécifique à l'aide d'une variable d'interface dans Go ?

Susan Sarandon
Libérer: 2024-11-27 16:58:11
original
492 Les gens l'ont consulté

How to Unmarshal JSON into a Specific Struct Using an Interface Variable in Go?

Comment désorganiser JSON dans une structure spécifique à l'aide de variables d'interface

Problème :

Quand En démarshalant JSON dans une variable d'interface, le package encoding/json l'interprète comme une carte. Comment pouvons-nous lui demander d'utiliser une structure spécifique à la place ?

Explication :

Le package JSON nécessite un type concret à cibler lors du démarshalage. Passer une variable interface{} ne fournit pas suffisamment d'informations et le package utilise par défaut map[string]interface{} pour les objets et []interface{} pour les tableaux.

Solution :

Il n'existe aucun moyen intégré pour dire à json.Unmarshal de se désorganiser en un type de structure concret à l'aide d'une variable d'interface. Cependant, il existe une solution de contournement :

  1. Enveloppez un pointeur vers la structure souhaitée dans la variable d'interface.
func getFoo() interface{} {
    return &Foo{"bar"}
}
Copier après la connexion
  1. Passez le pointeur encapsulé vers json. Unmarshal.
err := json.Unmarshal(jsonBytes, fooInterface)
Copier après la connexion
  1. Accédez aux données non marshalées via le variable d'interface.
fmt.Printf("%T %+v", fooInterface, fooInterface)
Copier après la connexion

Exemple :

Le code suivant illustre la technique :

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) // prints: *main.Foo &{Bar:This is the new value of bar}
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal