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

Comment modifier dynamiquement les balises JSON dans Go Structs ?

Susan Sarandon
Libérer: 2024-12-21 16:22:16
original
213 Les gens l'ont consulté

How to Dynamically Modify JSON Tags in Go Structs?

Comment modifier dynamiquement la balise JSON d'une structure

Dans Go, les structures peuvent être sérialisées en JSON à l'aide du package encoding/json. Par défaut, les noms de champs sont utilisés comme clés JSON. Cependant, vous pouvez personnaliser les clés JSON à l'aide de la balise json.

type User struct {
    ID   int64  `json:"id"`
    Name string `json:"first"` // want to change this to `json:"name"`
}
Copier après la connexion

Dans l'exemple ci-dessus, la balise json du champ Nom est définie sur "first". Cela signifie que lors du marshaling de la structure en JSON, le champ Nom sera représenté comme "premier" dans la sortie JSON.

Pour modifier dynamiquement la clé JSON d'un champ, vous pouvez utiliser le package Reflect pour accéder au balise du champ et modifier sa valeur. Cependant, il n'existe pas de méthode intégrée pour définir directement la valeur de la balise JSON.

Une façon de surmonter cette limitation consiste à utiliser une méthode MarshalJSON personnalisée. Cette méthode vous permet de contrôler la façon dont la structure est marshalée en JSON.

func (u *User) MarshalJSON() ([]byte, error) {
    value := reflect.ValueOf(*u)

    // Iterate through all the fields in the struct
    for i := 0; i < value.NumField(); i++ {
        tag := value.Type().Field(i).Tag.Get("json")

        // If the tag is empty, use the field name as the JSON key
        if tag == "" {
            tag = value.Type().Field(i).Name
        }

        // Update the tag with the new value
        value.Type().Field(i).Tag.Set("json", tag)
    }

    return json.Marshal(u)
}
Copier après la connexion

Dans la méthode MarshalJSON, nous parcourons d'abord tous les champs de la structure. Pour chaque champ, nous récupérons sa balise JSON et la stockons dans la variable tag. Si la balise est vide, nous utilisons le nom du champ comme clé JSON.

Nous définissons ensuite la nouvelle valeur de la balise JSON en appelant la méthode Set sur le champ Tag.

En remplaçant le MarshalJSON méthode, nous pouvons modifier dynamiquement les balises JSON des champs de la structure. Ceci est particulièrement utile lorsque vous devez personnaliser la sortie JSON en fonction de conditions spécifiques.

Pour parcourir tous les champs de la structure, y compris les champs intégrés, vous pouvez utiliser le champ Embedded de type StructField.

type User struct {
    // ...
    Another Another `json:",inline"`
}
Copier après la connexion

Dans l'exemple ci-dessus, la structure Another est intégrée dans la structure User à l'aide de la balise inline. Cela signifie que les champs de la structure Another seront marshalés en ligne avec les champs de la structure User.

Pour parcourir tous les champs de la structure User, y compris les champs intégrés, vous pouvez utiliser le code suivant :

for i := 0; i < value.NumField(); i++ {
    if value.Type().Field(i).Anonymous {
        // Iterate through the embedded fields
        innerValue := reflect.ValueOf(value.Field(i).Interface())
        for j := 0; j < innerValue.NumField(); j++ {
            fmt.Println(innerValue.Type().Field(j).Tag.Get("json"))
        }
    }
}
Copier après la connexion

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