Heim  >  Artikel  >  Backend-Entwicklung  >  Wie entmarshaliere ich eine JSON-Karte mit benutzerdefinierter Handhabung in eine Go-Struktur?

Wie entmarshaliere ich eine JSON-Karte mit benutzerdefinierter Handhabung in eine Go-Struktur?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-26 06:21:30135Durchsuche

How to Unmarshal a JSON Map into a Go Struct with Custom Handling?

Benutzerdefiniertes Unmarshaling einer Struktur in eine Karte von Slices

In Go umfasst das Unmarshaling die Konvertierung von JSON-Daten in eine Go-Datenstruktur. Während die Grundprinzipien des Unmarshaling unkompliziert sind, erfordern bestimmte Szenarien, wie das Auffüllen einer Karte, möglicherweise eine benutzerdefinierte Behandlung.

Problem: Auffüllen einer Karte beim Unmarshaling

Ein häufig auftretendes Problem ist der Versuch, eine Karte zu entmarshalieren in eine Go-Struktur zuordnen. Betrachten Sie das folgende Beispiel:

<code class="go">type OHLC_RESS struct {
    Pair map[string][]Candles
    Last int64 `json:"last"`
}

// Candles represents individual candlesticks within the map.
type Candles struct {
    // ... Time, Open, High, Low, Close, VWAP, Volume, Count fields omitted
}</code>

Beim Versuch, JSON-Daten mit der obigen Struktur zu entmarshalieren, wird das Feld „Last“ erfolgreich ausgefüllt, aber die Paarzuordnung bleibt leer.

Lösung: Benutzerdefiniertes Unmarshaling für die Struktur

Der standardmäßige Unmarshaling-Prozess in Go verwendet Feldnamen und Tags, um JSON-Schlüsseln zuzuordnen. In diesem Fall muss die Pair-Map jedoch individuell behandelt werden, da ihre Schlüsselnamen nicht im Voraus bekannt sind. Um dies zu erreichen, implementieren Sie die json.Unmarshaler-Schnittstelle für die OHLC_RESS-Struktur:

<code class="go">func (r *OHLC_RESS) UnmarshalJSON(d []byte) error {
    // Decode only the object's keys and leave values as raw JSON.
    var obj map[string]json.RawMessage
    if err := json.Unmarshal(d, &obj); err != nil {
        return err
    }

    // Decode the "last" element into the Last field.
    if last, ok := obj["last"]; ok {
        if err := json.Unmarshal(last, &r.Last); err != nil {
            return err
        }
        delete(obj, "last")
    }

    // Decode the remaining elements into the Pair map.
    r.Pair = make(map[string][]Candles, len(obj))
    for key, val := range obj {
        cc := []Candles{}
        if err := json.Unmarshal(val, &cc); err != nil {
            return err
        }
        r.Pair[key] = cc
    }

    return nil
}</code>

Diese benutzerdefinierte Unmarshaling-Funktion unterteilt den Dekodierungsprozess in Schritte. Es dekodiert zunächst die Schlüssel des Objekts, behandelt dann das „letzte“ Element separat und dekodiert schließlich die verbleibenden Elemente in die Pair-Map. Dieser Ansatz gewährt die Kontrolle über den Dekodierungsprozess und ermöglicht die benutzerdefinierte Behandlung bestimmter Felder wie der Pair-Map.

Das obige ist der detaillierte Inhalt vonWie entmarshaliere ich eine JSON-Karte mit benutzerdefinierter Handhabung in eine Go-Struktur?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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