Heim >Backend-Entwicklung >Golang >Wie entmarshaliere ich inhomogene JSON-Daten mit einem „Code'-Feld?

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

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-03 06:49:02498Durchsuche

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>

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!

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