Maison  >  Article  >  développement back-end  >  Comment aplatir les structures JSON Marshalled dans Go avec des membres anonymes ?

Comment aplatir les structures JSON Marshalled dans Go avec des membres anonymes ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-02 18:21:30414parcourir

How to flatten Marshalled JSON Structs in Go with anonymous members?

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!

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