Heim >Backend-Entwicklung >Golang >Wie führe ich Typzusicherungen für nicht gemarshaltete JSON-Daten in Go durch?

Wie führe ich Typzusicherungen für nicht gemarshaltete JSON-Daten in Go durch?

Susan Sarandon
Susan SarandonOriginal
2024-12-25 09:28:28955Durchsuche

How to Perform Type Assertions on Unmarshaled JSON Data in Go?

Typzusicherungen mit nicht gemarshallten Daten

In einem verteilten System werden Daten oft als JSON-Strings ausgetauscht. Beim Abrufen von JSON-Daten aus einer Nachrichtenwarteschlange kann es vorkommen, dass Sie die Daten in eine Schnittstelle deserialisieren{} und dann Typzusicherungen durchführen müssen, um den tatsächlichen Strukturtyp der Daten zu bestimmen.

Problem

Wenn Sie die empfangene JSON-Zeichenfolge in eine Schnittstelle {} entmarshallen und versuchen, das Ergebnis zu bestätigen, kann es zu einem unerwarteten Ergebnis kommen. Anstelle des erwarteten Strukturtyps erhalten Sie eine Map[string]Schnittstelle{}.

Lösung

Das Standardverhalten des JSON-Unmarshalings in eine Schnittstelle{} ergibt Typen wie bool, float64, string, []interface{} und map[string]interface{}. Da Something1 und Something2 benutzerdefinierte Strukturen sind, werden sie vom JSON-Unmarshaler nicht erkannt.

Um dieses Problem zu beheben, gibt es zwei Hauptansätze:

1. Direktes Unmarshalieren in benutzerdefinierte Strukturen

Code:

var input Something1
json.Unmarshal([]byte(msg), &input)
// Type assertions and processing can be performed here

var input Something2
json.Unmarshal([]byte(msg), &input)
// Type assertions and processing can be performed here

2. Von der Kartenoberfläche auspacken

Code:

var input interface{}
json.Unmarshal([]byte(msg), &input)

// Unpack the data from the map
switch v := input.(type) {
case map[string]interface{}:
    // Extract the data from the map and assign it to custom structs
}

Erweiterter Ansatz

Für eine vielseitigere Lösung: Erwägen Sie die Erstellung einer „Unpacker“-Struktur, die das Unmarshaling und die Typzusicherung übernimmt Prozess.

Code:

type Unpacker struct {
    Data       interface{}
}

func (u *Unpacker) UnmarshalJSON(b []byte) error {
    smth1 := &Something1{}
    err := json.Unmarshal(b, smth1)
    if err == nil && smth1.Thing != "" {
        u.Data = smth1
        return nil
    }

    smth2 := &Something2{}
    err = json.Unmarshal(b, smth2)
    if err != nil {
        return err
    }

    u.Data = smth2
    return nil
}

Fazit

Mit einem dieser Ansätze können Sie den Typ erfolgreich durchführen Behauptungen für Daten, die zuerst aus einem JSON-String in eine Schnittstelle{} entmarshallt werden. Die Wahl des Ansatzes hängt von den spezifischen Anforderungen Ihrer Anwendung ab.

Das obige ist der detaillierte Inhalt vonWie führe ich Typzusicherungen für nicht gemarshaltete JSON-Daten in Go durch?. 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