Maison > développement back-end > Golang > Comment étendre des structures Go inconnues avec des champs JSON arbitraires ?

Comment étendre des structures Go inconnues avec des champs JSON arbitraires ?

DDD
Libérer: 2025-01-03 20:32:41
original
252 Les gens l'ont consulté

How to Extend Unknown Go Structs with Arbitrary JSON Fields?

Extension de structures inconnues avec des champs JSON arbitraires

Dans Go, l'ajout de champs supplémentaires à une représentation JSON d'une structure connue peut être réalisé à l'aide d'un structure anonyme. Cependant, cette approche n’est pas applicable lorsqu’il s’agit de structures inconnues. Cet article explique comment obtenir des fonctionnalités similaires dans de tels scénarios.

Package Reflect pour la génération de types dynamiques

Une solution consiste à utiliser le package Reflect pour générer dynamiquement une structure personnalisée. tapez au moment de l’exécution. Ce type comprend un champ anonyme du même type que l'interface encapsulée et un champ "Extra" supplémentaire. Cela permet la promotion des champs de la structure intégrée, permettant une représentation JSON appropriée.

func printInterface(val interface{}) {
    // Define the new struct type dynamically
    t2 := reflect.StructOf([]reflect.StructField{
        {
            Name:      "X",
            Anonymous: true,
            Type:      reflect.TypeOf(val),
        },
        {
            Name: "Extra",
            Type: reflect.TypeOf(""),
        },
    })

    // Create a new instance of the dynamic type
    v2 := reflect.New(t2).Elem()
    v2.Field(0).Set(reflect.ValueOf(val))
    v2.FieldByName("Extra").SetString("text")

    // Encode the dynamic type's value to JSON
    json.NewEncoder(os.Stdout).Encode(v2.Interface())
}
Copier après la connexion

Double marshalling pour les champs JSON arbitraires

Une approche alternative consiste à sérialiser l'interface, analyser le JSON résultant dans une carte, ajouter le champ "Extra", puis resérialiser la carte modifiée en JSON. Cette méthode est plus simple mais peut entraîner une pénalité de performances en raison de plusieurs étapes de sérialisation.

func printInterface(val interface{}) error {
    // Serialize the interface to JSON
    data, err := json.Marshal(val)
    if err != nil {
        return err
    }

    // Unmarshal the JSON into a map
    v2 := map[string]interface{}{}
    if err := json.Unmarshal(data, &v2); err != nil {
        return err
    }

    // Add the "Extra" field to the map
    v2["Extra"] = "text"

    // Serialize the modified map to JSON
    return json.NewEncoder(os.Stdout).Encode(v2)
}
Copier après la connexion

Les deux méthodes étendent efficacement les structures inconnues avec le champ « Extra » souhaité dans la représentation JSON, répondant aux scénarios où la manipulation directe des structures n'est pas réalisable.

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