Heim >Backend-Entwicklung >Golang >Wie kann ich das JSON-Unmarshaling anpassen, um mehrdeutige boolesche Werte zu verarbeiten?

Wie kann ich das JSON-Unmarshaling anpassen, um mehrdeutige boolesche Werte zu verarbeiten?

Barbara Streisand
Barbara StreisandOriginal
2024-11-29 05:49:09187Durchsuche

How Can I Customize JSON Unmarshaling to Handle Ambiguous Boolean Values?

Erweitern der Booleschen Parsing-Optionen im JSON-Unmarshaling

Beim Zuordnen von Dienstausgaben, die die Grenzen zwischen booleschen Typen und anderen Werten verwischen, ist ein entgegenkommenderes JSON erforderlich Parser wird unverzichtbar. Die integrierte Codierungs-/JSON-Unmarshal-Funktion ist in dieser Hinsicht unzureichend und veranlasst die Suche nach freizügigen Parsing-Alternativen.

Ein Ansatz besteht darin, eine benutzerdefinierte UnmarshalJSON-Funktion für den gewünschten Typ zu erstellen. Diese Funktion kann benutzerdefinierte Parsing-Regeln definieren, um die mehrdeutigen booleschen Werte zu verarbeiten. Betrachten Sie beispielsweise den folgenden ConvertibleBoolean-Typ:

type ConvertibleBoolean bool

func (bit *ConvertibleBoolean) UnmarshalJSON(data []byte) error {
    asString := string(data)
    if asString == "1" || asString == "true" {
        *bit = true
    } else if asString == "0" || asString == "false" {
        *bit = false
    } else {
        return errors.New(fmt.Sprintf("Boolean unmarshal error: invalid input %s", asString))
    }
    return nil
}

In dieser Funktion werden die Zeichenfolgen „1“ und „true“ auf „true“ abgebildet, während „0“ und „false“ als „false“ analysiert werden. Werte außerhalb dieser Bereiche lösen einen Fehler aus.

Um diese benutzerdefinierte boolesche Analyse zu nutzen, wenden Sie ein JSON-Tag auf das Zielfeld an. Zum Beispiel:

type MyType struct {
    AsBoolean ConvertibleBoolean `json:"field1"`
    AlsoBoolean ConvertibleBoolean `json:"field2"`
}

Wenn diese benutzerdefinierten Parsing-Regeln vorhanden sind, erzeugt die JSON-Eingabe:

{
    "field1": true,
    "field2": 1
}

die folgende nicht gemarshallte Struktur:

obj := MyType{}
json_err := json.Unmarshal([]byte(input_json), &obj)
fmt.Printf("%v\n", obj.AsBoolean) //"true"
fmt.Printf("%v\n", obj.AlsoBoolean) //"true"

Von Durch die Nutzung benutzerdefinierter Parsing-Funktionen gewinnen Sie Flexibilität beim JSON-Unmarshaling und können so mit mehrdeutigen booleschen Werten umgehen benötigt.

Das obige ist der detaillierte Inhalt vonWie kann ich das JSON-Unmarshaling anpassen, um mehrdeutige boolesche Werte zu verarbeiten?. 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