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:
type Range struct {
Start int
End int
}
type User struct {
ID int
Pass int
}
Und Ihre JSON-Nachricht verfügt über ein „Code“-Feld, das signalisiert, welche Daten sich im „Payload“-Feld befinden:
{
"Code": 4,
"Payload": {
"Start": 1,
"End": 10
}
}
{
"Code": 3,
"Payload": {
"ID": 1,
"Pass": 1234
}
}
Sie müssen das „Payload“-Feld in die entsprechende Datenstruktur basierend auf dem „Code“-Feld entmarshalieren.
Lösung
Der Schlüssel Hier können Sie den Typ „json.RawMessage“ verwenden, um das Unmarshalling des Felds „Payload“ zu verzögern, bis Sie seinen Typ kennen. Zum Beispiel:
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)
}
}
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3