„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie entmarshaliere ich inhomogene JSON-Daten mit einem „Code“-Feld?

Wie entmarshaliere ich inhomogene JSON-Daten mit einem „Code“-Feld?

Veröffentlicht am 02.11.2024
Durchsuche:848

How to Unmarshal Non-Homogenous JSON Data with a \

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)
    }
}
Neuestes Tutorial Mehr>

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