Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich eine Struktur in Go benutzerdefiniert in eine Karte von Slices entmarshalieren, wenn die JSON-Schlüssel nicht mit den Feldnamen der Struktur übereinstimmen?

Wie kann ich eine Struktur in Go benutzerdefiniert in eine Karte von Slices entmarshalieren, wenn die JSON-Schlüssel nicht mit den Feldnamen der Struktur übereinstimmen?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-26 14:00:04742Durchsuche

How can I custom unmarshal a struct into a map of slices in Go when the JSON keys don't match the struct field names?

Benutzerdefiniertes Unmarshaling einer Struktur in eine Karte von Slices

Beim Umgang mit JSON-Daten kann es vorkommen, dass Sie bestimmte Elemente innerhalb des JSON-Objekts einem zuordnen müssen Feld, das mit Ihrer Datenstruktur übereinstimmt. Der standardmäßige JSON-Unmarshaling-Mechanismus erfüllt diese Anforderungen jedoch möglicherweise nicht immer. Hier kommt das benutzerdefinierte Unmarshaling ins Spiel.

Im bereitgestellten Beispiel haben Sie eine Struktur OHLC_RESS mit einem Kartenfeldpaar, das Kerzenabschnitte als Werte erwartet. Allerdings kann der ursprüngliche Code die Paarzuordnung nicht füllen.

Verstehen des Problems

Das Unmarshaling-Verhalten ist auf mehrere Faktoren zurückzuführen:

  1. JSON-Objektschlüssel stimmen nicht überein um Feldnamen zu strukturieren.
  2. Das Feldnamenpaar gibt dem Unmarshaler keine besondere Bedeutung.
  3. Das Last-Feld wird nicht gemarshallt, da sein JSON-Schlüssel (last) mit dem Feldnamen übereinstimmt.

Maßgeschneiderte Unmarshaling-Lösung

Um diese Probleme zu beheben, können Sie die json.Unmarshaler-Schnittstelle nutzen, indem Sie die entsprechende Methode in Ihrer Struktur implementieren:

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

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

    // Unmarshal 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 Lösung:

  1. Trennt die Dekodierung des Felds „Last“ von den Werten des übrigen Objekts.
  2. Erstellt eine Karte mit Zeichenfolgenschlüsseln und []Kerzenwerten zum Speichern der Paare.
  3. Durchläuft die verbleibenden JSON-Schlüssel und -Werte, entmarshalingt jeden in ein Candles-Segment und speichert es in der Pair-Map.

Durch die Implementierung dieses benutzerdefinierten Unmarshalings erhalten Sie die Flexibilität, zu steuern, wie spezifisch JSON-Elemente sind der gewünschten Datenstruktur zugeordnet, auch wenn die Struktur des JSON-Objekts nicht direkt damit übereinstimmt.

Das obige ist der detaillierte Inhalt vonWie kann ich eine Struktur in Go benutzerdefiniert in eine Karte von Slices entmarshalieren, wenn die JSON-Schlüssel nicht mit den Feldnamen der Struktur übereinstimmen?. 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