Heim > Backend-Entwicklung > Golang > Wie entmarshaliere ich dynamisches JSON mit einem eingebetteten Typschlüssel in Go?

Wie entmarshaliere ich dynamisches JSON mit einem eingebetteten Typschlüssel in Go?

Susan Sarandon
Freigeben: 2024-12-08 01:48:16
Original
544 Leute haben es durchsucht

How to Unmarshal Dynamic JSON with an Embedded Type Key in Go?

Unmarshaling von dynamischem JSON mit einem eingebetteten Typschlüssel

In Go kann das Unmarshaling von JSON-Daten in eine Struktur mit einem Feld eines dynamischen Typs erfolgen herausfordernd. In diesem Artikel wird eine Lösung untersucht, die benutzerdefinierte Strukturen und einen eingebetteten Typschlüssel nutzt, um dies zu erreichen.

Problemstellung

Bedenken Sie die folgende JSON-Struktur:

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

Wir möchten diesen JSON in eine Go-Struktur entmarshalieren, die ein Feld „DynamicField“ eines Schnittstellentyps „Something“ enthält. Abhängig vom Wert des Typschlüssels im JSON sollte DynamicField entweder DynamicTypeA oder DynamicTypeB entsprechen.

Lösung

Um dieses Problem zu lösen, definieren wir den folgenden Brauch structs:

type Something interface {
  GetType() string
}

type DynamicType struct {
  Type   string      `json:"type"`
  Value  interface{} `json:"-"` // Not exported
}
Nach dem Login kopieren

DynamicType stellt das dynamische Feld dar, wobei der Type-Schlüssel eingebettet ist, um den tatsächlichen Typ des zu bestimmen Daten. Das Wertfeld wird nicht exportiert, um direkten Zugriff zu verhindern.

Als nächstes definieren wir die Go-Struktur zur Darstellung des JSON:

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

Schließlich 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(DynamicTypeA)
  case "B":
    d.Value = new(DynamicTypeB)
  }
  return json.Unmarshal(data, d.Value)
}
Nach dem Login kopieren

Diese Methode entpackt den Typschlüssel und erstellt dann eine entsprechende Struktur (DynamicTypeA oder DynamicTypeB). auf den Wert. Anschließend werden die verbleibenden JSON-Daten in die erstellte Struktur entmarshmiert, die dann im Feld „Wert“ gespeichert wird.

Das obige ist der detaillierte Inhalt vonWie entmarshaliere ich dynamisches JSON mit einem eingebetteten Typschlüssel in Go?. 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