Heim  >  Artikel  >  Backend-Entwicklung  >  Wie entmarshallt man beliebige JSON-Daten in Go mit einem dynamischen Code-gesteuerten Schema?

Wie entmarshallt man beliebige JSON-Daten in Go mit einem dynamischen Code-gesteuerten Schema?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-01 08:22:30679Durchsuche

How to Unmarshall Arbitrary JSON Data in Go with a Dynamic Code-Driven Schema?

Unmarshalling beliebiger Daten mit JSON and Go

Sie haben eine bestimmte Anforderung: JSON-Daten so zu entmarshallen, dass Sie sie verarbeiten können Teile oder Abschnitte. Um dies zu erreichen, stellen Sie sich eine Struktur vor, bei der die erste Hälfte der Daten oder der „Code“ angibt, wie die zweite Hälfte zu interpretieren ist. Zwei mögliche Strukturen für die zweite Hälfte sind Range und User.

Die Herausforderung

Das vorhandene JSON-Paket in Go bietet praktische Funktionen zum Marshalling und Unmarshalling definierter Strukturen, aber es deckt nicht Ihren Bedarf an beliebigen Daten ab.

Dekodierung der Lösung

Die Lösung besteht darin, ein json.RawMessage-Feld (Payload) in Ihre Nachrichtenstruktur einzuführen. Mit diesem Feld können Sie das Parsen der Daten verzögern, bis Sie den in der ersten Hälfte angegebenen Code kennen.

Hier ist eine Beispielimplementierung in Go:

<code class="go">type Message struct {
    Code    int
    Payload json.RawMessage
}
type Range struct {
    Start int
    End   int
}
type User struct {
    ID   int
    Pass int
}

// Custom unmarshalling function
func MyUnmarshall(m []byte) {
    var message Message
    json.Unmarshal(m, &message)
    var payload interface{}
    switch message.Code {
    case 3:
        payload = new(User)
    case 4:
        payload = new(Range)
    }
    json.Unmarshal(message.Payload, payload)
}</code>

Verwendung

Sie würden diese Lösung verwenden, indem Sie zunächst die „obere Hälfte“ mithilfe der json.Unmarshal-Funktion entmarshallen. Basierend auf dem aus der „oberen Hälfte“ abgerufenen Code würden Sie dann die „untere Hälfte“ mithilfe der json.Unmarshal-Funktion erneut entmarshallen und dieses Mal das Ziel-json.RawMessage-Objekt bereitstellen.

Beispiel

<code class="go">json := []byte(`{"Code": 4, "Payload": {"Start": 1, "End": 10}}`)
MyUnmarshall(json) // This will decode the data into a Range object</code>

Überlegungen

Mit dieser Technik können Sie das Unmarshalling beliebiger Daten strukturiert und flexibel handhaben. Es führt jedoch zu einer Laufzeitabhängigkeit von der Kenntnis des Codes im Voraus und der Existenz passender Strukturen für verschiedene Codes.

Das obige ist der detaillierte Inhalt vonWie entmarshallt man beliebige JSON-Daten in Go mit einem dynamischen Code-gesteuerten Schema?. 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