Go에서 인코딩/json 패키지를 사용할 때 시간 값을 비정렬화하는 기본 동작은 다음과 같습니다. RFC 3339 형식을 엄격히 준수합니다. 그러나 이 표준에서 벗어나는 시간 형식을 발견하면 어떻게 될까요?
이러한 상황을 처리하려면 사용자 정의에서 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() }
CustomTime 유형을 사용하려면 이를 구조체:
type Args struct { Time CustomTime }
다음은 Args 구조체 및 CustomTime 유형을 사용하여 비RFC 3339 시간 형식이 포함된 JSON 문자열을 역마샬링하는 방법에 대한 예입니다.
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()) }
출력:
<nil> 2014-08-01 11:27:18 +0000 UTC
작성자 사용자 정의 CustomTime 유형을 구현하면 RFC 3339 형식이 아닌 시간 형식의 역직렬화를 처리할 수 있습니다.
위 내용은 Go에서 `encoding/json`을 사용하여 비RFC 3339 시간 형식을 역직렬화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!