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
Susan Sarandonoriginal
2024-12-21 16:22:16215parcourir

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"`
}

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)
}

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"`
}

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"))
        }
    }
}

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