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

Mary-Kate Olsen
Freigeben: 2024-11-03 06:49:02
Original
402 Leute haben es durchsucht

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:

<code class="go">type Range struct {
    Start int
    End   int
}

type User struct {
    ID    int
    Pass  int
}</code>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!