Aplatissement des structures JSON marshallisées avec des membres anonymes dans Go
Dans le code suivant :
<code class="go">type Anything interface{} type Hateoas struct { Anything Links map[string]string `json:"_links"` } func MarshalHateoas(subject interface{}) ([]byte, error) { h := &Hateoas{subject, make(map[string]string)} switch s := subject.(type) { case *User: h.Links["self"] = fmt.Sprintf("http://user/%d", s.Id) case *Session: h.Links["self"] = fmt.Sprintf("http://session/%d", s.Id) } return json.MarshalIndent(h, "", " ") }</code>
l'objectif est pour rassembler JSON de manière à ce que le membre anonyme soit aplati. Par défaut, le membre anonyme est traité comme un champ nommé distinct dans la sortie JSON.
La solution à ce problème consiste à utiliser le package Reflect pour mapper manuellement les champs de la structure que nous souhaitons sérialiser sur une carte[ chaîne]interface{}. De cette façon, nous pouvons conserver la structure plate de la structure d'origine sans introduire de nouveaux champs.
Voici le code qui accomplit cela :
<code class="go">func MarshalHateoas(subject interface{}) ([]byte, error) { links := make(map[string]string) out := make(map[string]interface{}) subjectValue := reflect.Indirect(reflect.ValueOf(subject)) subjectType := subjectValue.Type() for i := 0; i < subjectType.NumField(); i++ { field := subjectType.Field(i) name := subjectType.Field(i).Name out[field.Tag.Get("json")] = subjectValue.FieldByName(name).Interface() } switch s := subject.(type) { case *User: links["self"] = fmt.Sprintf("http://user/%d", s.Id) case *Session: links["self"] = fmt.Sprintf("http://session/%d", s.Id) } out["_links"] = links return json.MarshalIndent(out, "", " ") }</code>
Ce code parcourt les champs de la structure , récupère leurs valeurs et les ajoute à la carte de sortie en utilisant la balise JSON du champ comme clé. Ce processus garantit que les champs du membre anonyme sont aplatis dans la carte de sortie.
En personnalisant le processus de marshaling JSON de cette manière, nous pouvons obtenir la sortie JSON souhaitée tout en conservant la flexibilité et la sécurité de type fournies par une interface.
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!