Heim > Backend-Entwicklung > Golang > Wie entmarshaliere ich dynamische JSON-Felder in Go basierend auf einem Typschlüssel?

Wie entmarshaliere ich dynamische JSON-Felder in Go basierend auf einem Typschlüssel?

Susan Sarandon
Freigeben: 2024-12-05 20:17:10
Original
508 Leute haben es durchsucht

How to Unmarshal Dynamic JSON Fields in Go Based on a Type Key?

Unmarshalieren von dynamischem JSON basierend auf einem Typschlüssel

Das Unmarshaling komplexer JSON-Daten in eine Go-Struktur kann eine Herausforderung sein, wenn die JSON-Struktur dynamische Felder enthält unterschiedlicher Art. Dieser Artikel befasst sich mit einem bestimmten Szenario, in dem die JSON-Felder hauptsächlich einfache Werte enthalten, aber gelegentlich ein dynamisches Feld mit einem bestimmten Typschlüssel den Typ des Feldwerts bestimmt.

Das Ziel besteht darin, eine Go-Struktur damit zu erstellen Struktur wie das bereitgestellte JSON, wobei das dynamische Feld als Schnittstellentyp dargestellt wird, was eine flexible Handhabung basierend auf seinem Typ ermöglicht.

Eine mögliche Lösung nutzt den folgenden Brauch Typen:

type BigStruct struct {
    SomeData     string    `json:"some_data"`
    DynamicField Something `json:"dynamic_field"`
    OtherData    string    `json:"other_data"`
}

type Something interface {
    GetType() string
}
Nach dem Login kopieren

Dann erstellen Sie individuelle Strukturen für jeden dynamischen Feldtyp:

type BaseDynamicType struct {
    Type string `json:"type"`
}

type DynamicTypeA struct {
    BaseDynamicType
    Name string `json:"name"`
}

type DynamicTypeB struct {
    BaseDynamicType
    Address string `json:"address"`
}

func (d *BaseDynamicType) GetType() string {
    return d.Type
}
Nach dem Login kopieren

Um den JSON in dieser Struktur zu entmarshalieren, kann BigStruct eine benutzerdefinierte UnmarshalJSON-Methode implementieren:

func (b *BigStruct) UnmarshalJSON(data []byte) error {
    var tmp struct {
        SomeData     string          `json:"some_data"`
        DynamicField json.RawMessage `json:"dynamic_field"`
        OtherData    string          `json:"other_data"`
    }

    if err := json.Unmarshal(data, &tmp); err != nil {
        return err
    }
    b.Unmarshal(tmp.DynamicField)

    return nil
}
Nach dem Login kopieren

Die Unmarshal-Methode kann aus UnmarshalJSON heraus aufgerufen werden, um die Dynamik zu analysieren Feld:

func (b *BigStruct) Unmarshal(data json.RawMessage) error {
    switch UnmarshalledType(data) {
    case "A":
        var a DynamicTypeA
        if err := json.Unmarshal(data, &a); err != nil {
            return err
        }

        b.DynamicField = &a
    case "B":
        var b DynamicTypeB
        if err := json.Unmarshal(data, &b); err != nil {
            return err
        }

        b.DynamicField = &b
    }

    return nil
}

func UnmarshalledType(b json.RawMessage) string {
    var typ struct {
        Type string `json:"type"`
    }

    if err := json.Unmarshal(b, &typ); err != nil {
        log.Fatalf("Error extracting type from RawMessage: %v", err)
    }

    return typ.Type
}
Nach dem Login kopieren

Mit diesem Ansatz können Sie dynamische JSON-Felder in der Go-Struktur entmarshalieren, ohne ein zusätzliches Platzhalterfeld einzuführen.

Das obige ist der detaillierte Inhalt vonWie entmarshaliere ich dynamische JSON-Felder in Go basierend auf einem Typschlüssel?. 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