Heim >Backend-Entwicklung >Golang >Wie kann ich verschachtelte JSON-Daten entmarshalieren, ohne deren Struktur zu kennen?

Wie kann ich verschachtelte JSON-Daten entmarshalieren, ohne deren Struktur zu kennen?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-02 16:55:03413Durchsuche

How can I unmarshal nested JSON data without knowing its structure?

Unmarshalling von verschachteltem JSON ohne bekannte Struktur

Wenn Sie auf verschachtelte JSON-Daten ohne definierte Strukturen stoßen, gibt es mehrere Ansätze, um die Herausforderungen beim Unmarshalling zu mindern.

Vermeidung wiederholter Unmarshallings

Es ist generell ratsam, Unmarshalling-Vorgänge zu minimieren. Erwägen Sie die Implementierung eines Caching-Mechanismus, um nicht gemarshallte Objekte für die zukünftige Verwendung zu speichern und wiederholtes Unmarshalling zu vermeiden. In einigen Fällen kann jedoch ein mehrfaches Unmarshalling erforderlich sein, insbesondere wenn es um verschachtelte Strukturen unterschiedlicher Art geht.

Bestimmen der richtigen Struktur für das Unmarshalling

Methode 1: Entmarshalieren Sie die json.RawMessage in eine Map[string]-Schnittstelle{}. Dies ermöglicht die Untersuchung der verschachtelten Struktur, um den Typ und anschließend die richtige Struktur für das Unmarshalling zu ermitteln.

Beispiel:

Methode 2 : Übereinstimmung mit regulären Ausdrücken
<code class="go">var objMap map[string]interface{}
json.Unmarshal(rawMessage, &objMap)</code>

Verwenden Sie einen regulären Ausdruck, um die Typzeichenfolge in den JSON-Daten abzugleichen. Sobald der Typ bekannt ist, verwenden Sie Reflektion oder einen Typschalter, um das Unmarshalieren in die entsprechende Struktur zu entpacken.

Beispiel:

Verwenden von Copy oder Regular Ausdrucksansatz
<code class="go">type Regex *regexp.Regexp

// Split the JSON data into key-value pairs
type KeyValue struct {
    Key   string
    Value string
}

// Regex for extracting the type
var typeRE = Regex(regexp.MustCompile(`(?m)^.*"type": "(.+)".*$`))

// Unmarshal the raw message and extract the type
func getType(rawMessage []byte) (string, error) {
    var data KeyValue
    err := json.Unmarshal(rawMessage, &data)
    if err != nil {
        return "", err
    }
    matches := typeRE.FindStringSubmatch(data.Value)
    return matches[1], nil
}</code>

Methode A: Kopieren und Unmarshalieren

Erstellen Sie eine Kopie der json.RawMessage.

    Unmarshalieren Sie die Kopie in eine Schnittstelle{}, um den Typ zu identifizieren.
  1. Unmarshalieren Sie die ursprüngliche json.RawMessage in die Struktur des bestimmten Typs.
  2. Methode B: Regulärer Ausdruck und Unmarshalieren

Verwenden Sie den regulären Ausdruck, um den Typ zu bestimmen.

    Verwenden Sie Reflektion oder einen Typschalter, um eine neue Instanz der Struktur mit dem ermittelten Typ zu erstellen.
  1. Unmarshalieren Sie die json.RawMessage in die neu erstellte Struktur.

Das obige ist der detaillierte Inhalt vonWie kann ich verschachtelte JSON-Daten entmarshalieren, ohne deren Struktur zu kennen?. 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