Wie kann ich JSON-Strukturen mit anonymen Mitgliedern in Go reduzieren?

Mary-Kate Olsen
Freigeben: 2024-10-28 05:20:30
Original
234 Leute haben es durchsucht

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

Abflachen von Marshalled-JSON-Strukturen mit anonymen Mitgliedern in Go

Der bereitgestellte Code versucht, Strukturen, die anonyme Mitglieder enthalten, in abgeflachte JSON-Objekte mit benutzerdefinierten „ _links"-Felder. Das anonyme Mitglied „Anything“ wird jedoch als benanntes Feld behandelt, was zu unerwünschten JSON-Strukturen führt.

Grundlegendes zur Handhabung anonymer Mitglieder beim JSON-Marshalling

Gos JSON-Marshaller Behandelt anonyme Strukturfelder so, als ob ihre inneren exportierten Felder Felder in der äußeren Struktur wären. Dieses Verhalten kann überschrieben werden, indem ein JSON-Tag mit einem Namen bereitgestellt wird, es gibt jedoch keinen expliziten Mechanismus zum Reduzieren anonymer Mitglieder.

Lösung mit Reflection

Um das Gewünschte zu erreichen Beim Abflachen nutzt die folgende Lösung das Reflect-Paket. Indem wir über die Felder der Struktur iterieren, können wir eine Map[string]-Schnittstelle{} erstellen, die die Struktur des ursprünglichen Objekts beibehält, ohne neue Felder einzuführen:

<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>
Nach dem Login kopieren

Beispielverwendung

Das folgende Beispiel zeigt die abgeflachte JSON-Ausgabe für eine Benutzer- und Sitzungsstruktur:

<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>
Nach dem Login kopieren

JSON-Ausgabe:

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

Das obige ist der detaillierte Inhalt vonWie kann ich JSON-Strukturen mit anonymen Mitgliedern in Go reduzieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!