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

Wie entmarshaliere ich dynamisches JSON in Go basierend auf einem Typschlüssel ohne generische Felder?

Patricia Arquette
Freigeben: 2024-12-19 10:49:12
Original
337 Leute haben es durchsucht

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

Unmarshaling von dynamischem JSON basierend auf einem Typschlüssel ohne Einführung generischer Felder

Viele strukturierte JSON-Daten erfordern das Unmarshaling in Go-Strukturen, die oft verschachtelte Felder enthalten mit unterschiedlichen Datentypen. Wenn der Datentyp eines verschachtelten Felds je nach Typschlüssel im JSON variiert, können herkömmliche Methoden zum Unmarshalling mithilfe benutzerdefinierter Felder zu unnötigem Boilerplate-Code führen.

In diesem Zusammenhang betrachten wir die folgende JSON-Spezifikation:

{
  "some_data": "foo",
  "dynamic_field": { "type": "A", "name": "Johnny" },
  "other_data": "bar"
}
Nach dem Login kopieren

und

{
  "some_data": "foo",
  "dynamic_field": { "type": "B", "address": "Somewhere" },
  "other_data": "bar"
}
Nach dem Login kopieren

Diese beiden JSON-Dokumente sollten im selben Go entmarshallt werden struct:

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

Die Herausforderung besteht darin, den Typ „Something“ zu definieren, der dynamische Daten basierend auf dem Schlüssel „type“ im Objekt „dynamic_field“ aufnehmen kann.

Um die Notwendigkeit zu vermeiden Für ein explizites „generisches“ Feld (z. B. Wert, Daten) können wir die Leistungsfähigkeit der Typeinbettung und von Schnittstellen nutzen.

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

type DynamicType struct {
  Value interface{}
}
Nach dem Login kopieren

Innerhalb der „DynamicType“, das „Value“-Feld kann jeden Datentyp enthalten, basierend auf dem „Type“-Schlüssel im JSON. Um das ordnungsgemäße Unmarshalling zu erleichtern, implementieren wir die UnmarshalJSON-Methode für „DynamicType“:

func (d *DynamicType) UnmarshalJSON(data []byte) error {
    var typ struct {
        Type string `json:"type"`
    }
    if err := json.Unmarshal(data, &typ); err != nil {
        return err
    }
    switch typ.Type {
    case "A":
        d.Value = new(TypeA)
    case "B":
        d.Value = new(TypeB)
    }
    return json.Unmarshal(data, d.Value)
}
Nach dem Login kopieren

Wir definieren spezifische Typen für verschiedene Datentypen:

type TypeA struct {
    Name string `json:"name"`
}

type TypeB struct {
    Address string `json:"address"`
}
Nach dem Login kopieren

Mit diesem Ansatz können wir das Entpacken Sie die JSON-Dokumente, ohne dass ein zusätzliches generisches Feld erforderlich ist, sodass wir eine saubere und erweiterbare Datenstruktur beibehalten können.

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