Heim >Backend-Entwicklung >Golang >Wie kann ich inkonsistente String- oder Array-JSON-Felder effizient entmarshalieren?

Wie kann ich inkonsistente String- oder Array-JSON-Felder effizient entmarshalieren?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-05 14:53:14449Durchsuche

How Can I Efficiently Unmarshal Inconsistent String or Array JSON Fields?

Unmarshalling flexibler JSON-Felder: Konvertieren inkonsistenter String- oder Array-Werte

Problem

Unmarshalling von JSON kann eine Herausforderung sein, wenn ein Feld inkonsistent sein kann und so aussieht entweder eine Zeichenfolge oder ein Array von Zeichenfolgen. Diese Inkonsistenz kann zu Unmarshalling-Fehlern führen, die dazu führen, dass Ihre Anwendung fehlschlägt.

Lösung

Rohdatenerfassung von JSON verwenden

Verwenden Sie die json.RawMessage-Daten Struktur, um das variierende JSON-Feld als Rohdaten zu erfassen. Nutzen Sie außerdem das JSON-Namensschild „-“, um das Feld während der ersten Dekodierungsphase zu verbergen.

type MyListItem struct {
    Date           string          `json:"date"`
    RawDisplayName json.RawMessage `json:"display_name"`
    DisplayName    []string        `json:"-"`
}

Unmarshal Top-Level JSON

Unmarshall the top- JSON-Struktur auf Ebene ohne Ausfüllen des DisplayName-Felds.

var li MyListItem
if err := json.Unmarshal(data, &li); err != nil {
    // handle error
}

Rohanzeige analysieren Name

Entpacken Sie je nach Art der Rohdaten den Anzeigenamen in das entsprechende Format.

if len(li.RawDisplayName) > 0 {
    switch li.RawDisplayName[0] {
    case '"':
        if err := json.Unmarshal(li.RawDisplayName, &li.DisplayName); err != nil {
            // handle error
        }
    case '[':
        var s []string
        if err := json.Unmarshal(li.RawDisplayName, &s); err != nil {
            // handle error
        }
        // Join arrays with "&&"
        li.DisplayName = strings.Join(s, "&&")
    }
}

Handle Listings Array

Integrieren Sie die oben genannte Logik in eine Schleife, um ein Array von MyListItem-Objekten innerhalb eines MyListings zu verarbeiten Struktur.

var listings MyListings
if err := json.Unmarshal([]byte(data), &listings); err != nil {
    // handle error
}
for i := range listings.CLItems {
    li := &listings.CLItems[i]
    // Parse raw display name
    if len(li.RawDisplayName) > 0 {
        switch li.RawDisplayName[0] {
        case '"':
            if err := json.Unmarshal(li.RawDisplayName, &li.DisplayName); err != nil {
                // handle error
            }
        case '[':
            var s []string
            if err := json.Unmarshal(li.RawDisplayName, &s); err != nil {
                // handle error
            }
            li.DisplayName = strings.Join(s, "&&")
        }
    }
}

Logik kapseln

Für wiederholtes Vorkommen von Feldern mit unterschiedlichen Typen sollten Sie erwägen, die Parsing-Logik in einen benutzerdefinierten Typ zu kapseln, der die json.Unmarshaler-Schnittstelle implementiert .

Handle-Array Werte

Um den Feldwert als Teil von Zeichenfolgen und nicht als verbundene Zeichenfolge beizubehalten, ändern Sie den Typ multiString entsprechend.

Diese Techniken bieten robuste Methoden für den Umgang mit inkonsistenten JSON-Feldern und stellen so sicher erfolgreiches Unmarshalling und genauer Datenabruf.

Das obige ist der detaillierte Inhalt vonWie kann ich inkonsistente String- oder Array-JSON-Felder effizient entmarshalieren?. 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