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
Freigeben: 2024-12-05 14:53:14
Original
450 Leute haben es durchsucht

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:"-"`
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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, "&&")
    }
}
Nach dem Login kopieren

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, "&&")
        }
    }
}
Nach dem Login kopieren

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!

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