Maison > développement back-end > Golang > Comment puis-je étendre la sortie JSON avec des structures inconnues dans Go ?

Comment puis-je étendre la sortie JSON avec des structures inconnues dans Go ?

Barbara Streisand
Libérer: 2024-12-04 05:29:10
original
817 Les gens l'ont consulté

How Can I Extend JSON Output with Unknown Structs in Go?

Extension de la sortie JSON avec des structures inconnues

Aperçu du problème

L'ajout de champs arbitraires à la sortie JSON peut être réalisé en étendant un structure connue de manière anonyme. Cependant, cette approche est limitée lorsqu’il s’agit de structures ou d’interfaces inconnues. Cet article explore les solutions à ce défi.

Solution 1 : génération de type dynamique à l'aide de Reflection

Une solution consiste à générer un type dynamique au moment de l'exécution à l'aide du package Reflect. Ce nouveau type est une structure avec un champ anonyme du type d'interface encapsulé et un champ supplémentaire pour la valeur supplémentaire. En réfléchissant à la valeur et en définissant les champs en conséquence, nous pouvons obtenir la sortie JSON souhaitée.

func printInterface(val interface{}) {
    // Create a new struct type with anonymous field for the interface
    t2 := reflect.StructOf([]reflect.StructField{
        {Name: "X", Anonymous: true, Type: reflect.TypeOf(val)},
        {Name: "Extra", Type: reflect.TypeOf("")},
    })

    // Create a new value of the dynamic type
    v2 := reflect.New(t2).Elem()
    // Set the value of the anonymous field to the input interface
    v2.Field(0).Set(reflect.ValueOf(val))
    // Set the extra field to the desired value
    v2.FieldByName("Extra").SetString("text")

    json.NewEncoder(os.Stdout).Encode(v2.Interface())
}
Copier après la connexion

Solution 2 : Marshaling et Unmarshaling

Alternativement, nous pouvons rassembler la valeur en JSON, la décomposer dans une carte, ajouter le champ supplémentaire et rassembler le résultat encore une fois.

func printInterface(val interface{}) error {
    // Marshal the value 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
    v2["Extra"] = "text"

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

Comparaison des solutions

La solution basée sur la réflexion génère un nouveau type spécifiquement pour l'interface donnée, ce qui donne lieu à une approche plus adaptée et potentiellement plus rapide. . La solution de marshaling et de démarshaling est plus simple mais plus lente en raison de l’étape de marshaling supplémentaire. L'ordre des champs dans la sortie JSON peut également différer dans cette dernière approche.

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