생략 태그 옵션은 구조체이기 때문에 time.Time과 함께 작동하지 않습니다. 이는 시간의 "0" 값이 의미합니다.Time은 모든 필드 값이 0으로 설정된 유효한 값이며, 이는 json 인코더에서 "빈" 값으로 처리되지 않습니다.
이 문제를 극복하려면, time.Time(*time.Time)에 대한 포인터를 사용하고 사용자 정의 인코딩 및 디코딩을 구현하는 사용자 정의 접근 방식을 살펴보겠습니다.
포인터로 전환하면 JSON 인코더에서 nil 값이 "비어 있음"으로 해석됩니다.
type MyStruct struct { Timestamp *time.Time `json:",omitempty"` Date *time.Time `json:",omitempty"` Field string `json:",omitempty"` }
그러지 않으려는 경우 포인터를 사용하면 사용자 정의 Marshaler 및 Unmarshaler를 구현할 수 있습니다. 인터페이스:
type MyStruct struct { Timestamp time.Time `json:"Timestamp"` Date time.Time `json:"Date"` Field string `json:"Field"` } func (ms MyStruct) MarshalJSON() ([]byte, error) { type Alias MyStruct if ms.Timestamp.IsZero() { ms.Timestamp = time.Time{} } if ms.Date.IsZero() { ms.Date = time.Time{} } return json.Marshal(Alias(ms)) } func (ms *MyStruct) UnmarshalJSON(data []byte) error { type Alias MyStruct aux := &Alias{} if err := json.Unmarshal(data, aux); err != nil { return err } *ms = MyStruct(aux) return nil }
여기서 MarshalJSON 메서드는 0 값의 time.Time 인스턴스를 해당 Go 0 값으로 설정하여 빈 필드 처리를 활성화합니다.
포인터 기반 솔루션은 간단하고 효과적입니다. 그러나 포인터를 사용할 수 없는 경우 사용자 정의 Marshaler/Unmarshaler 접근 방식은 빈 time.Time 값을 처리하는 유연한 방법을 제공합니다.
위 내용은 Go JSON 마샬링에서 `time.Time` 필드로 `omitempty`를 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!