Benutzerdefiniertes JSON-Unmarshaling für Nicht-RFC 3339-Zeitformate
Das Encoding/JSON-Paket in Go hält sich strikt an das RFC 3339-Zeitformat, wenn Deserialisieren von JSON-Daten. Dies kann unpraktisch sein, wenn Sie mit Zeitformaten arbeiten, die von diesem Standard abweichen.
Lösung: Implementierung benutzerdefinierter Marshaler und Unmarshaler
Anstatt die vorhandenen JSON-Daten zu ändern oder sich darauf zu verlassen Für Zwischenkonvertierungsschritte besteht eine geeignetere Lösung darin, die Schnittstellen json.Marshaler und json.Unmarshaler auf einer benutzerdefinierten Ebene zu implementieren Typ.
Das folgende Beispiel zeigt, wie ein benutzerdefinierter Typ (CustomTime) erstellt wird, der die Deserialisierung eines bestimmten Nicht-RFC 3339-Zeitformats verarbeitet:
import ( "fmt" "strconv" "strings" "time" "github.com/golang/protobuf/ptypes/timestamp" ) type CustomTime struct { time.Time } const ctLayout = "2006/01/02|15:04:05" func (ct *CustomTime) UnmarshalJSON(b []byte) (err error) { s := strings.Trim(string(b), "\"") if s == "null" { ct.Time = time.Time{} return } ct.Time, err = time.Parse(ctLayout, s) return } func (ct *CustomTime) MarshalJSON() ([]byte, error) { if ct.Time.IsZero() { return []byte("null"), nil } return []byte(fmt.Sprintf("\"%s\"", ct.Time.Format(ctLayout))), nil } var nilTime = (time.Time{}).UnixNano() func (ct *CustomTime) IsSet() bool { return !ct.IsZero() } type Args struct { Time CustomTime } var data = ` {"Time": "2014/08/01|11:27:18"} ` func main() { a := Args{} if err := json.Unmarshal([]byte(data), &a); err != nil { fmt.Println("Error unmarshaling: ", err) return } if !a.Time.IsSet() { fmt.Println("Time not set") } else { fmt.Println(a.Time.String()) } }
Hinweis: Die CustomTime.IsSet()-Methode prüft, ob das Zeitfeld nicht Null ist, und bietet so eine Möglichkeit, festzustellen, ob der Zeitwert tatsächlich festgelegt wurde oder nicht.
Durch die Implementierung benutzerdefinierter Marshaler und Unmarshaler erhalten Sie die Flexibilität, Zeitformate zu verarbeiten, die vom RFC 3339-Standard abweichen können, und ermöglichen so eine nahtlose Deserialisierung von JSON-Daten in Go.
Das obige ist der detaillierte Inhalt vonWie gehe ich beim Unmarshaling von JSON in Go mit Nicht-RFC 3339-Zeitformaten um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!