Maison >développement back-end >Golang >Comment puis-je modifier dynamiquement les balises JSON dans Go Structs ?

Comment puis-je modifier dynamiquement les balises JSON dans Go Structs ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-23 14:20:11939parcourir

How Can I Dynamically Change JSON Tags in Go Structs?

Changement dynamique de la balise JSON de Struct

Les balises Struct dans Go jouent un rôle crucial dans l'encodage et le décodage des données JSON. Cependant, il devient parfois nécessaire de modifier ces balises de manière dynamique en fonction de certains critères. Dans cet article, nous explorons une solution pour y parvenir en utilisant la réflexion Go et d'autres techniques.

Problème

Considérez l'extrait de code suivant :

type User struct {
    ID   int64  `json:"id"`
    Name string `json:"first"` // want to change this to `json:"name"`
}

Notre objectif est de changer la balise JSON pour le champ Nom de json:"first" en json:"name" avant de rassembler la structure vers JSON.

Solution : Utiliser un alias avec des balises personnalisées

Avec Go 1.8 et supérieur, nous pouvons surmonter la limitation des balises struct immuables en utilisant un alias avec des balises personnalisées . Voici comment procéder :

type User struct {
    ID   int64  `json:"id"`
    Name string `json:"first"`
}

func (u *User) MarshalJSON() ([]byte, error) {
    type alias struct {
        ID   int64  `json:"id"`
        Name string `json:"name"`
    }
    var a alias = alias(*u)
    return json.Marshal(&a)
}

Dans la méthode MarshalJSON, nous définissons un type d'alias qui a la même structure que User mais avec les balises JSON souhaitées. En attribuant u (la structure User d'origine) à une variable de type alias, nous modifions effectivement les balises JSON. Lorsque nous marshalons l'alias (au lieu de l'utilisateur d'origine), le résultat est conforme au format JSON souhaité.

Implémentation personnalisée

Pour modifier dynamiquement les balises de plusieurs champs , nous pouvons utiliser la réflexion pour parcourir les champs de la structure User et mettre à jour les balises en conséquence. Voici une implémentation personnalisée :

import (
    "reflect"
    "strings"
)

func ModifyTags(u *User) {
    value := reflect.ValueOf(u)
    for i := 0; i < value.NumField(); i++ {
        tag := value.Type().Field(i).Tag.Get("json")
        if strings.HasPrefix(tag, "custom:") {
            value.Type().Field(i).Tag.Set("json", strings.TrimPrefix(tag, "custom:"))
        }
    }
}

En appelant ModifyTags, nous pouvons modifier dynamiquement les balises des champs qui ont le préfixe "custom:". Cette approche permet une modification flexible des balises en fonction de critères spécifiques.

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