Go에서 비RFC 3339 시간 형식의 JSON 역마샬링
Go에서 인코딩/json 패키지의 기본 동작은 마샬링하고 RFC 3339 형식의 시간 값을 비정렬화합니다. 하지만 다른 형식의 시간 값이 포함된 JSON 데이터를 발견하면 어떻게 될까요?
수동 변환을 사용한 솔루션
한 가지 접근 방식은 시간 값을 문자열로 역직렬화하는 것입니다. 수동으로 RFC 3339 형식으로 변환한 다음 json.Unmarshal을 다시 적용하세요. 이 방법이 작동하는 동안 추가 처리 오버헤드가 발생하고 코드가 복잡해집니다.
사용자 정의 시간 유형
보다 우아한 솔루션은 json.Marshaler 및 json.Unmarshaler를 구현하는 것입니다. 사용자 정의 시간 유형에 대한 인터페이스. 이를 통해 시간 값 직렬화 및 역직렬화를 사용자 정의 처리할 수 있습니다.
구현 예
다음은 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() }
이 커스텀 시간에 유형:
사용
이제 JSON 역직렬화 코드에서 CustomTime 유형을 사용할 수 있습니다.
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()) }
이 접근 방식을 사용하면 유연성을 저하시키지 않으면서 JSON 데이터의 비RFC 3339 시간 형식을 우아하고 효율적으로 처리할 수 있습니다. 또한 데이터 유형 직렬화 및 역직렬화를 처리하기 위한 사용자 정의 json.Marshaler 및 json.Unmarshaler 인터페이스 구현의 강력한 기능을 보여줍니다.
위 내용은 Go의 JSON 언마샬링에서 비RFC 3339 시간 형식을 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!