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

Comment puis-je aplatir les structures JSON avec des membres anonymes dans Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-28 05:20:30224parcourir

How Can I Flatten JSON Structs with Anonymous Members in Go?

Aplatissement des structures JSON marshallisées avec des membres anonymes dans Go

Le code fourni tente de transformer les structures contenant des membres anonymes en objets JSON aplatis avec des " _liens". Cependant, le membre anonyme « Anything » est traité comme un champ nommé, ce qui conduit à des structures JSON indésirables.

Comprendre la gestion des membres anonymes dans le marshaling JSON

Le marshaleur JSON de Go traite les champs de structure anonymes comme si leurs champs exportés internes étaient des champs de la structure externe. Ce comportement peut être remplacé en fournissant une balise JSON avec un nom, mais il n'existe aucun mécanisme explicite pour aplatir les membres anonymes.

Solution utilisant Reflection

Pour obtenir le résultat souhaité aplatissement, la solution ci-dessous utilise le package Reflect. En parcourant les champs de la structure, nous pouvons créer une map[string]interface{} qui conserve la structure de l'objet d'origine sans introduire de nouveaux champs :

<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()
    }
    ...
}</code>

Exemple d'utilisation

L'exemple suivant montre la sortie JSON aplatie pour une structure Utilisateur et Session :

<code class="go">package main

import (
    "encoding/json"
    "fmt"
    "reflect"
)

type User struct {
    Id   int    `json:"id"`
    Name string `json:"name"`
}

type Session struct {
    Id     int `json:"id"`
    UserId int `json:"userId"`
}

func MarshalHateoas(subject interface{}) ([]byte, error) {
    ...  
}

func main() {
    u := &User{123, "James Dean"}
    s := &Session{456, 123}

    json, err := MarshalHateoas(u)
    if err != nil {
        panic(err)
    } else {
        fmt.Println("User JSON:")
        fmt.Println(string(json))
    }

    json, err = MarshalHateoas(s)
    if err != nil {
        panic(err)
    } else {
        fmt.Println("Session JSON:")
        fmt.Println(string(json))
    }
}</code>

Sortie JSON :

User JSON:
{
    "id": 123,
    "name": "James Dean",
    "_links": {
        "self": "http://user/123"
    }
}
Session JSON:
{
    "id": 456,
    "userId": 123,
    "_links": {
        "self": "http://session/456"
    }
}

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