Maison > développement back-end > Golang > Comment puis-je ajouter des champs arbitraires à la sortie JSON pour les structures Go inconnues ?

Comment puis-je ajouter des champs arbitraires à la sortie JSON pour les structures Go inconnues ?

Patricia Arquette
Libérer: 2024-12-16 06:10:10
original
700 Les gens l'ont consulté

How Can I Add Arbitrary Fields to JSON Output for Unknown Go Structs?

Extension de la sortie JSON pour des structures inconnues

Problème :

Lorsque vous traitez des structures ou des interfaces inconnues, l'ajout de champs arbitraires à La sortie JSON peut être difficile. Le code démontré illustre ce problème. Comment pouvons-nous reproduire la sortie JSON souhaitée pour les structures inconnues ?

Solution 1 : génération de type dynamique à l'aide de la réflexion

Une approche consiste à utiliser la réflexion pour générer un type dynamique au moment de l'exécution. . Ce type est une structure avec un champ anonyme du type d'interface encapsulé et un champ supplémentaire. En manipulant ce type dynamique, nous pouvons obtenir la sortie JSON souhaitée.

func printInterface(val interface{}) {
    t2 := reflect.StructOf([]reflect.StructField{
        {Name: "X", Anonymous: true, Type: reflect.TypeOf(val)},
        {Name: "Extra", Type: reflect.TypeOf("")},
    })

    v2 := reflect.New(t2).Elem()
    v2.Field(0).Set(reflect.ValueOf(val))
    v2.FieldByName("Extra").SetString("text")

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

Solution 2 : Marshal-Unmarshal-Marshal

Une solution alternative consiste à rassembler l'entrée valeur, en la désorganisant dans une carte, en ajoutant le champ supplémentaire et en la rassemblant encore une fois.

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

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

    v2["Extra"] = "text"
    return json.NewEncoder(os.Stdout).Encode(v2)
}
Copier après la connexion

Les deux solutions nous permettent d'ajouter des champs arbitraires à la sortie JSON pour les structures inconnues. La première solution est plus sophistiquée et offre un meilleur contrôle, tandis que la seconde solution est plus simple mais moins performante en raison du double marshalling. En fin de compte, le choix de la solution dépend des exigences spécifiques et des priorités du cas d'utilisation.

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