Maison > développement back-end > Golang > Comment effectuer des assertions de type sur des données JSON non marshalées dans Go ?

Comment effectuer des assertions de type sur des données JSON non marshalées dans Go ?

Susan Sarandon
Libérer: 2024-12-25 09:28:28
original
1006 Les gens l'ont consulté

How to Perform Type Assertions on Unmarshaled JSON Data in Go?

Assertions de type avec des données non marshalées

Dans un système distribué, les données sont souvent échangées sous forme de chaînes JSON. Lors de la récupération de données JSON à partir d'une file d'attente de messages, vous pouvez rencontrer un scénario dans lequel vous devez désérialiser les données dans une interface {}, puis effectuer des assertions de type pour déterminer le type de structure réel des données.

Problème

Lors du déclassement de la chaîne JSON reçue dans une interface{} et de la tentative de saisie du résultat, vous pouvez rencontrer un résultat inattendu. Au lieu du type de structure attendu, vous obtenez une map[string]interface{}.

Solution

Le comportement par défaut du démarshaling JSON dans une interface{} donne des types tels que bool, float64, string, []interface{} et map[string]interface{}. Puisque Something1 et Something2 sont des structures personnalisées, elles ne sont pas reconnues par le démarshaler JSON.

Pour résoudre ce problème, il existe deux approches principales :

1. Démarrez directement dans les structures personnalisées

Code :

var input Something1
json.Unmarshal([]byte(msg), &input)
// Type assertions and processing can be performed here

var input Something2
json.Unmarshal([]byte(msg), &input)
// Type assertions and processing can be performed here
Copier après la connexion

2. Décompresser depuis Map Interface

Code :

var input interface{}
json.Unmarshal([]byte(msg), &input)

// Unpack the data from the map
switch v := input.(type) {
case map[string]interface{}:
    // Extract the data from the map and assign it to custom structs
}
Copier après la connexion

Approche avancée

Pour une solution plus polyvalente, envisagez de créer une structure "Unpacker" qui gère le démarshalage et l'assertion de type processus.

Code :

type Unpacker struct {
    Data       interface{}
}

func (u *Unpacker) UnmarshalJSON(b []byte) error {
    smth1 := &Something1{}
    err := json.Unmarshal(b, smth1)
    if err == nil && smth1.Thing != "" {
        u.Data = smth1
        return nil
    }

    smth2 := &Something2{}
    err = json.Unmarshal(b, smth2)
    if err != nil {
        return err
    }

    u.Data = smth2
    return nil
}
Copier après la connexion

Conclusion

En utilisant l'une de ces approches, vous pouvez effectuer avec succès un type assertions sur les données qui sont d'abord non marshalées dans une interface {} à partir d'une chaîne JSON. Le choix de l'approche dépend des exigences spécifiques de votre application.

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 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