Boolesche Werte aus JSON mit 0 und Falsch entmarshallen
Das Parsen von JSON-Daten erfordert eine sorgfältige Prüfung der Datentypen, um Fehlinterpretationen zu vermeiden. In Fällen, in denen ein Dienst boolesche Werte als 0 und falsch (sowie 1 und wahr) austauscht, ist die Erzielung eines ordnungsgemäßen Unmarshallings von entscheidender Bedeutung.
Das integrierte Paket „encoding/json“ bietet eine Methode zum Anpassen des Unmarshalling-Prozesses mithilfe benutzerdefinierter Typen . Durch die Definition eines benutzerdefinierten Typs können Sie eine maßgeschneiderte Unmarshalling-Logik implementieren, um die gewünschte Konvertierung durchzuführen.
Benutzerdefinierter Unmarshalling-Typ
Erstellen Sie einen benutzerdefinierten Typ, der die json.Unmarshaler-Schnittstelle implementiert . Dieser Typ ist für die Konvertierung von JSON-Daten in das gewünschte boolesche Format verantwortlich.
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 diesem Beispiel ist ConvertibleBoolean ein benutzerdefinierter boolescher Typ, der die json.Unmarshaler-Schnittstelle implementiert. Es überschreibt den standardmäßigen JSON-Unmarshalling-Prozess und prüft die eingehenden Daten als Zeichenfolge. Wenn eine Zeichenfolge identifiziert wird, die „true“ oder „false“ darstellt (oder deren numerische Gegenstücke 1 und 0), wird der ConvertibleBoolean-Wert entsprechend festgelegt. Andernfalls wird ein Fehler zurückgegeben.
Verwenden des benutzerdefinierten Typs
Da Sie nun über einen benutzerdefinierten Unmarshalling-Typ verfügen, verwenden Sie ihn in einer Struktur, um die erwartete JSON-Struktur zu definieren.
type MyType struct { AsBoolean ConvertibleBoolean `json:"field1"` AlsoBoolean ConvertibleBoolean `json:"field2"` }
Beispiel Unmarshalling
Wenn der benutzerdefinierte Typ vorhanden ist, können Sie JSON-Daten in eine MyType-Struktur entmarshallen und dabei sowohl 0 als auch false (sowie 1 und true) korrekt in boolesche Werte konvertieren.
input_json := `{ "field1" : true, "field2" : 1 }` obj := MyType{} json_err := json.Unmarshal([]byte(input_json), &obj) fmt.Printf("%v\n", obj.AsBoolean) //"true" fmt.Printf("%v\n", obj.AlsoBoolean) //"true"
Diese Beispiel-JSON-Daten enthalten „true“ und „1“, die vom Standard-Unmarshaller als unterschiedliche Typen behandelt würden. Durch die Verwendung von ConvertibleBoolean werden jedoch beide Werte korrekt als wahr entmarshallt.
Das obige ist der detaillierte Inhalt vonWie gehe ich mit dem booleschen Unmarshalling von JSON mit „0' und „false' (und „1' und „true') um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!