Heim > Artikel > Backend-Entwicklung > Wie entmarshallt man beliebige JSON-Daten in Go mit einem dynamischen Code-gesteuerten 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!