Heim >Backend-Entwicklung >Golang >Wie gehe ich mit inkonsistenten JSON-Feldern um: Strings vs. Arrays?

Wie gehe ich mit inkonsistenten JSON-Feldern um: Strings vs. Arrays?

Barbara Streisand
Barbara StreisandOriginal
2024-12-05 03:51:13210Durchsuche

How to Handle Inconsistent JSON Fields: Strings vs. Arrays?

Umgang mit inkonsistenten JSON-Feldern: Ein Fall von Strings vs. Arrays

Beim Umgang mit JSON-Daten, die nicht vollständig konsistent sind, können Herausforderungen auftreten im Unmarshalling-Prozess. Dies kann auftreten, wenn ein bestimmtes Feld im JSON in seinem Format variiert, was den Unmarshalling-Prozess erschwert.

Das Problem:

Stellen Sie sich das folgende Szenario vor:

type MyListItem struct {
    Date  string `json:"date"`
    DisplayName       string `json:"display_name"`
}

type MyListings struct {
    CLItems []MyListItem `json:"myitems"`
}

Die JSON-Daten verfügen über ein Feld namens „display_name“, bei dem es sich voraussichtlich um eine Zeichenfolge handelt. In einigen Fällen kann es sich jedoch auch um ein Array aus Zeichenfolgen handeln. Diese Inkonsistenz verkompliziert den Unmarshalling-Prozess und führt zu Fehlern.

Die Lösung:

Um diese Herausforderung zu meistern, können wir zwei Techniken nutzen:

  1. Verwendung von json.RawMessage: Erfassen Sie das problematische Feld als json.RawMessage-Typ.
  2. Verwendung des JSON-Namens „-“: Definieren Sie das Feld „DisplayName“ als „-“ im JSON-Decoder, um es vom Unmarshalling-Prozess auszuschließen.

Aktualisiert Code:

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

Entmarshalling des JSON:

Unmarshalling des JSON der obersten Ebene:

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

Extrahieren des „DisplayName " Feld abhängig von seiner Typ:

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, "&&")
    }
}

Beispiel:

var listings MyListings
if err := json.Unmarshal([]byte(data), &listings); err != nil {
    // handle error
}
for i := range listings.CLItems {
    li := &listings.CLItems[i]
    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, "&&")
        }
    }
}

Durch die Anwendung dieser Techniken können Sie inkonsistente JSON-Felder effektiv verarbeiten und so eine ordnungsgemäße Datenextraktion und -bearbeitung in Ihrer Anwendung sicherstellen .

Das obige ist der detaillierte Inhalt vonWie gehe ich mit inkonsistenten JSON-Feldern um: Strings vs. Arrays?. 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