Maison > développement back-end > Golang > Comment désorganiser efficacement JSON dans une interface {} dans Go ?

Comment désorganiser efficacement JSON dans une interface {} dans Go ?

DDD
Libérer: 2024-12-30 03:50:09
original
128 Les gens l'ont consulté

How to Effectively Unmarshal JSON into an Interface{} in Go?

Désassembler JSON dans une interface{} dans Go : un guide détaillé

Comprendre comment désorganiser JSON dans une interface{} est une compétence cruciale pour les développeurs Go. Dans cet article, nous passerons en revue un exemple pratique qui met en évidence les pièges et les solutions associés au démarshaling de JSON dans une structure avec un champ interface{}.

Considérez les définitions de types suivantes :

type Message struct {
    Cmd string `json:"cmd"`
    Data interface{} `json:"data"`
}

type CreateMessage struct {
    Conf map[string]int `json:"conf"`
    Info map[string]int `json:"info"`
}
Copier après la connexion

Étant donné une chaîne JSON représentant un message de création, nous pourrions tenter de le décoder en un message struct :

{"cmd":"create","data":{"conf":{"a":1},"info":{"b":2}}
Copier après la connexion
import "encoding/json"

var data = []byte(`{"cmd":"create","data":{"conf":{"a":1},"info":{"b":2}}`)

var m Message
if err := json.Unmarshal(data, &m); err != nil {
    log.Fatal(err)
}
Copier après la connexion

En examinant la structure Message non marshalée, nous remarquons que le champ Données reste sous la forme d'une map[string]interface{} :

{Cmd:create Data:map[conf:map[a:1] info:map[b:2]]}
Copier après la connexion

Surmonter l'interface {} Piège

Pour surmonter cette limitation, nous employons une approche à deux volets approche :

  1. Définissez un type de structure pour la partie fixe du message. Cela inclut le champ cmd et un champ json.RawMessage pour capturer la partie variante du message.
  2. Définissez les types de structure pour chacun des types de variantes. Dans notre cas, nous définissons un CreateMessage struct.
type Message struct {
  Cmd string `json:"cmd"`
  Data      json.RawMessage
}  

type CreateMessage struct {
    Conf map[string]int `json:"conf"`
    Info map[string]int `json:"info"`
}  
Copier après la connexion

Avec ces modifications, nous pouvons décoder les données variantes dans le type de structure approprié en fonction de la commande :

func main() {
    var m Message
    if err := json.Unmarshal(data, &m); err != nil {
        log.Fatal(err)
    }
    switch m.Cmd {
    case "create":
        var cm CreateMessage
        if err := json.Unmarshal([]byte(m.Data), &cm); err != nil {
            log.Fatal(err)
        }
        fmt.Println(m.Cmd, cm.Conf, cm.Info)
    default:
        log.Fatal("bad command")
    }
}
Copier après la connexion

En employant cette technique, nous pouvons réussissez à désassembler les données JSON dans la structure Message, où le champ Données contient la variante du type CreateMessage. Reportez-vous à l'exemple de terrain de jeu fourni pour une implémentation complète.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal