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
Susan SarandonOriginal
2024-12-08 01:48:16591Durchsuche

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"
}

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
}

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"`
}

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)
}

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!

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