Go JSON의 비RFC 3339 시간 형식에 대한 사용자 정의 역마샬링
Go에서 인코딩/json 패키지는 RFC 3339를 엄격하게 준수합니다. 시간 값을 역직렬화합니다. 그러나 데이터가 다른 시간 형식으로 제공되는 상황이 종종 있습니다. 번거로운 변환을 피하고 싶다면 문제가 될 수 있습니다.
사용자 정의 유형 사용
이를 처리하려면 json.Marshaler 및 json.Unmarshaler 인터페이스를 구현할 수 있습니다. 사용자 정의 유형에. 이를 통해 유형이 JSON과 마샬링 및 역마샬링되는 방식을 정의할 수 있습니다.
예를 들어 다음 CustomTime 유형을 사용하면 다양한 형식의 시간 값을 역마샬링할 수 있습니다.
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() }
In 이 유형은 다음과 같습니다.
JSON 구조체에서 CustomTime 유형을 사용하여 처리할 수 있습니다. 비RFC 3339 형식의 시간 값 역직렬화:
type Args struct { Time CustomTime } var data = ` {"Time": "2014/08/01|11:27:18"} ` func main() { a := Args{} fmt.Println(json.Unmarshal([]byte(data), &a)) fmt.Println(a.Time.String()) }
이 예에서 Args 구조체는 Time 필드에 CustomTime 유형을 사용합니다. RFC 3339가 아닌 시간 형식으로 JSON 데이터를 역직렬화하면 CustomTime 유형이 변환을 올바르게 처리합니다.
위 내용은 Go JSON 언마샬링에서 비RFC 3339 시간 형식을 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!