Unmarshalling inhomogener JSON-Daten
Diese Untersuchung konzentriert sich auf das effiziente Unmarshalling von JSON-Daten durch die Nutzung eines Mechanismus, der das selektive Unmarshalling bestimmter Abschnitte ermöglicht oder Segmente. Das Ziel besteht darin, JSON-Strukturen zu verarbeiten, bei denen der erste Teil als „Code“ dient, der die Art der im zweiten Teil enthaltenen Daten bestimmt.
Stellen Sie sich ein Szenario vor, in dem Sie über mehrere Datenstrukturen verfügen:
<code class="go">type Range struct { Start int End int } type User struct { ID int Pass int }</code>
Und Ihre JSON-Nachricht verfügt über ein „Code“-Feld, das signalisiert, welche Daten sich im „Payload“-Feld befinden:
<code class="json">{ "Code": 4, "Payload": { "Start": 1, "End": 10 } } { "Code": 3, "Payload": { "ID": 1, "Pass": 1234 } }</code>
Sie müssen das „Payload“-Feld in die entsprechende Datenstruktur entmarshalieren auf dem Feld „Code“.
Lösung
Der Schlüssel hier besteht darin, den Typ json.RawMessage zu verwenden, um das Unmarshalling des Felds „Payload“ bis nach Ihnen zu verzögern kenne seinen Typ. Zum Beispiel:
<code class="go">package main import ( "encoding/json" "fmt" ) type Message struct { Code int Payload json.RawMessage // Delay parsing until we know the code } // Unmarshall into appropriate structures based on Code func unmarshal(m []byte) error { var message Message err := json.Unmarshal(m, &message) if err != nil { return err } switch message.Code { case 3: var user User if err := json.Unmarshal(message.Payload, &user); err != nil { return err } fmt.Printf("Unmarshalled a User: %#v\n", user) case 4: var range Range if err := json.Unmarshal(message.Payload, &range); err != nil { return err } fmt.Printf("Unmarshalled a Range: %#v\n", range) default: return fmt.Errorf("unknown code: %d", message.Code) } return nil } func main() { json1 := []byte(`{"Code": 3, "Payload": {"ID": 1, "Pass": 1234}}`) if err := unmarshal(json1); err != nil { fmt.Printf("error: %v\n", err) } json2 := []byte(`{"Code": 4, "Payload": {"Start": 1, "End": 10}}`) if err := unmarshal(json2); err != nil { fmt.Printf("error: %v\n", err) } }</code>
Das obige ist der detaillierte Inhalt vonWie entmarshaliere ich inhomogene JSON-Daten mit einem „Code'-Feld?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!