UnmarshalJSON-Implementierung für abgeleitete Skalare in Go
Problem:
Ein benutzerdefinierter Typ, der subtypisierte Ganzzahlkonstanten konvertiert zu Strings und umgekehrt erfordert ein automatisches Unmarshalling von JSON-Strings. Dies ist eine Herausforderung, da UnmarshalJSON keine Möglichkeit bietet, den Skalarwert ohne Verwendung einer Struktur zu ändern.
Lösung:
Berücksichtigen Sie die folgenden Schritte, um UnmarshalJSON für einen abgeleiteten Skalartyp zu implementieren :
Verwenden Sie einen Zeiger Empfänger:
Verwenden Sie einen Zeigerempfänger für die UnmarshalJSON-Methode, um den Wert des Empfängers zu ändern.
Unmarshalieren zu einem String:
Unmarshalieren Sie den JSON-Text in a einfache Zeichenfolge, wobei alle JSON-Zitate entfernt werden.
Suchen und Festlegen Wert:
Verwenden Sie die Lookup-Funktion, um die entsprechende PersonID basierend auf dem Zeichenfolgenwert abzurufen. Ordnen Sie das Ergebnis dem Empfänger zu.
Beispiel:
func (intValue *PersonID) UnmarshalJSON(data []byte) error { var s string if err := json.Unmarshal(data, &s); err != nil { return err } *intValue = Lookup(s) return nil }
Codebeispiel:
package main import ( "encoding/json" "fmt" ) type PersonID int const ( Bob PersonID = iota Jane Ralph Nobody = -1 ) var nameMap = map[string]PersonID{ "Bob": Bob, "Jane": Jane, "Ralph": Ralph, "Nobody": Nobody, } var idMap = map[PersonID]string{ Bob: "Bob", Jane: "Jane", Ralph: "Ralph", Nobody: "Nobody", } func (intValue PersonID) Name() string { return idMap[intValue] } func Lookup(name string) PersonID { return nameMap[name] } func (intValue *PersonID) UnmarshalJSON(data []byte) error { var s string if err := json.Unmarshal(data, &s); err != nil { return err } *intValue = Lookup(s) return nil } type MyType struct { Person PersonID `json: "person"` Count int `json: "count"` Greeting string `json: "greeting"` } func main() { var m MyType if err := json.Unmarshal([]byte(`{"person": "Ralph", "count": 4, "greeting": "Hello"}`), &m); err != nil { fmt.Println(err) } else { for i := 0; i < m.Count; i++ { fmt.Println(m.Greeting, m.Person.Name()) } } }
Ausgabe:
Hello Ralph Hello Ralph Hello Ralph Hello Ralph
Das obige ist der detaillierte Inhalt vonWie implementiert man UnmarshalJSON für abgeleitete Skalartypen in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!