Maison >développement back-end >Golang >Comment puis-je modifier dynamiquement les balises JSON dans les structures Go au moment de l'exécution ?

Comment puis-je modifier dynamiquement les balises JSON dans les structures Go au moment de l'exécution ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-21 15:46:10774parcourir

How Can I Dynamically Change JSON Tags in Go Structs at Runtime?

Changement dynamique des balises JSON dans les structures

Problème

Une structure avec des structures imbriquées est donnée, et le but est de modifier dynamiquement la balise JSON de un champ spécifique dans la structure avant de l'encoder en JSON. La sortie JSON souhaitée doit avoir un nom de champ spécifique remplacé.

Solution

Utilisation d'une structure anonyme dans MarshalJSON

Dans les versions Go 1.8 et supérieures , une technique peut être utilisée pour modifier dynamiquement la balise JSON d'un champ au moment de l'exécution. Cela implique de créer une structure anonyme avec les balises de champ souhaitées dans la méthode MarshalJSON de la structure d'origine.

func (u *User) MarshalJSON() ([]byte, error) {
    type alias struct {
        ID   int64  `json:"id"`
        Name string `json:"name"` // The modified JSON tag
        tag  string `json:"-"`
        Another
    }

    var a alias = alias(*u)
    return json.Marshal(&a)
}

Ici, la structure alias a les mêmes champs que la structure User, mais le champ Nom a le champ souhaité. Balise JSON ("nom" au lieu de "premier"). En renvoyant l'encodage JSON de la structure d'alias, le nom du champ JSON peut être remplacé dynamiquement.

Itération sur tous les champs

Pour parcourir tous les champs d'une structure, y compris les structures intégrées, utilisez le Reflect package comme suit :

value := reflect.ValueOf(*u)
for i := 0; i < value.NumField(); i++ {
    tag := value.Type().Field(i).Tag.Get("json")
    field := value.Field(i)
    fmt.Println(tag, field)
}

Ce code itérera sur tous les champs, y compris ceux de la structure Another intégrée, et imprimez la balise JSON et la valeur du champ pour chaque champ.

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