Heim  >  Artikel  >  Backend-Entwicklung  >  Wie entmarshaliere ich beliebige JSON-Daten mit unterschiedlichen Strukturen basierend auf einem „Code“?

Wie entmarshaliere ich beliebige JSON-Daten mit unterschiedlichen Strukturen basierend auf einem „Code“?

Linda Hamilton
Linda HamiltonOriginal
2024-10-30 10:21:03531Durchsuche

How to Unmarshal Arbitrary JSON Data with Varying Structures Based on a

Unmarshalling willkürlicher JSON-Daten

Frage:

Können JSON-Daten auf eine Art und Weise gemarshallt werden? das es ermöglicht, es in Teilen oder Abschnitten zu entmarshallen? In diesem Szenario definiert die obere Hälfte der Daten einen „Code“, der den Datentyp in der unteren Hälfte angibt, der zwischen den Strukturen variieren kann. Wie kann dies in Go erreicht werden?

Antwort:

Um beliebige JSON-Daten zu entmarshallen, bei denen die untere Hälfte zwischen den Strukturen variieren kann, können Sie das Parsen der unteren Hälfte verzögern, bis der „Code“ aus der oberen Hälfte ist bekannt.

Implementierung:

  1. Definieren Sie eine Nachrichtenstruktur mit einem int-Code-Feld und einem json.RawMessage-Payload-Feld . In diesem Feld wird vorübergehend die ungeparste untere Hälfte gespeichert.
  2. Erstellen Sie Funktionen zum Parsen und Unmarshallen der verschiedenen Strukturtypen basierend auf dem Code.
  3. Unmarshallen Sie die Nachrichtenstruktur aus den JSON-Daten. Dadurch wird die obere Hälfte der Daten analysiert und die Analyse der unteren Hälfte verzögert.
  4. Erstellen Sie basierend auf dem Code eine Instanz des entsprechenden Strukturtyps und entmarshallen Sie die Nutzlast darin.

Beispielcode:

<code class="go">package main

import (
    "encoding/json"
    "fmt"
)

type Message struct {
    Code    int
    Payload json.RawMessage
}
type Range struct {
    Start int
    End   int
}
type User struct {
    ID   int
    Pass int
}

func MyUnmarshall(m []byte) {
    var message Message
    var payload interface{}
    json.Unmarshal(m, &message)
    switch message.Code {
    case 3:
        payload = new(User)
    case 4:
        payload = new(Range)
    }
    json.Unmarshal(message.Payload, payload)
    fmt.Printf("\n%v%+v", message.Code, payload)
}

func main() {
    json := []byte(`{"Code": 4, "Payload": {"Start": 1, "End": 10}}`)
    MyUnmarshall(json)
    json = []byte(`{"Code": 3, "Payload": {"ID": 1, "Pass": 1234}}`)
    MyUnmarshall(json)
}</code>

Das obige ist der detaillierte Inhalt vonWie entmarshaliere ich beliebige JSON-Daten mit unterschiedlichen Strukturen basierend auf einem „Code“?. 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