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

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

DDD
DDDOriginal
2024-12-07 22:31:12628Durchsuche

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

Unmarshalling inkonsistenter JSON-Felder mit Arrays und Strings

Unmarshalling von JSON kann eine Herausforderung sein, wenn die Daten inkonsistent sind, beispielsweise wenn ein Feld inkonsistent sein kann entweder eine Zeichenfolge oder ein Array von Zeichenfolgen. Um dieses Szenario zu bewältigen, können wir verschiedene Strategien anwenden.

Variierende Daten mit RawMessage erfassen

Für Felder mit unterschiedlichen Typen können wir json.RawMessage verwenden, um die nicht analysierten Daten zu erfassen Daten. Dadurch können wir das Feld nach dem Unmarshalling des JSON der obersten Ebene manipulieren.

Felder mit „-“-Tag ausblenden

Um das Feld „DisplayName“ vor der automatischen Dekodierung auszublenden , können wir das Tag „-“ in der Strukturdefinition verwenden. Dadurch wird verhindert, dass die Anwendung diesem Feld während des Unmarshallings auf oberster Ebene Werte zuweist.

Bestimmen des Feldtyps und Ausfüllen

Sobald der JSON der obersten Ebene dekodiert wurde, können wir kann den Typ des RawDisplayName-Felds überprüfen, um festzustellen, ob es sich um eine Zeichenfolge oder ein Array handelt. Wenn es sich um einen String handelt, entpacken wir ihn in ein String-Slice. Wenn es sich um ein Array handelt, verbinden wir die Werte mit „&&“ gemäß der ursprünglichen Frage.

Benutzerdefinierte Unmarshal-Schnittstelle

Für Szenarien mit mehreren Feldern unterschiedlichen Typs gilt: Es kann von Vorteil sein, die Parsing-Logik in einem benutzerdefinierten Typ zu kapseln, der die json.Unmarshaler-Schnittstelle implementiert. Dies ermöglicht eine zentrale Kontrolle über den Datenkonvertierungsprozess.

Beispielimplementierung

Hier ist eine Beispielimplementierung, die den angegebenen JSON verarbeitet:

package main

import (
    "encoding/json"
    "fmt"
    "strings"
)

type multiString string

func (ms *multiString) UnmarshalJSON(data []byte) error {
    *ms = ""
    if len(data) > 0 {
        switch data[0] {
        case '"':
            var s string
            if err := json.Unmarshal(data, &s); err != nil {
                return err
            }
            *ms = multiString(s)
        case '[':
            var s []string
            if err := json.Unmarshal(data, &s); err != nil {
                return err
            }
            *ms = multiString(strings.Join(s, "&&"))
        }
    }
    return nil
}

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

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

func main() {
    var listings MyListings
    err := json.Unmarshal([]byte(`{
        "date": "30 Apr",
        "display_name": "Mr Smith"
    },{
        "date": "30 Apr",
        "display_name": ["Mr Smith", "Mr Jones"]
    }`), &listings)
    if err != nil {
        fmt.Println(err)
        return
    }

    fmt.Println(listings)
}

Durch die Verwendung dieser Techniken können wir JSON effektiv mit Feldern unterschiedlicher Art entmarshamlingieren und so sicherstellen, dass die Anwendung die Daten korrekt verarbeiten kann.

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