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!