생략이 있는 시간 필드의 JSON 생략
JSON 직렬화에 시간 필드를 선택적으로 포함하려는 노력의 일환으로 json:",omitempty" 태그가 일반적으로 사용됩니다. 그러나 time.Time 필드와 함께 사용하면 예기치 않은 동작이 나타날 수 있습니다.
핵심 문제는 구조체로서의 time.Time의 특성에 있습니다. 명확한 "빈" 상태(예: 빈 문자열)를 갖는 문자열이나 정수와 같은 스칼라 유형과 달리 구조체에는 초기화되었지만 빈 인스턴스를 나타내는 "0" 값이 있습니다. 이 경우 time.Time의 0 값은 모든 필드를 기본값으로 초기화합니다.
이러한 구별로 인해 json:",omitempty"는 값이 0인 time.Time을 "로 인식하지 않습니다. 비어 있음"이며 항상 JSON 출력에 포함됩니다. 이러한 한계를 극복하려면 다음 접근 방식 중 하나를 채택할 수 있습니다.
1. 포인터 유형 사용:
time.Time 필드를 포인터(*time.Time)로 변환하면 JSON 처리에서 nil 포인터가 "빈" 것으로 간주된다는 점을 활용할 수 있습니다. 이 솔루션은 코드를 단순화합니다:
type MyStruct struct { Timestamp *time.Time `json:",omitempty"` Field string `json:",omitempty"` }
2. 사용자 정의 Marshaler 및 Unmarshaler 구현:
포인터 사용이 불가능한 경우 time.Time.IsZero()를 활용하여 필드를 조건부로 포함하거나 제외하는 구조체에 대한 사용자 정의 JSON Marshaler 및 Unmarshaler 메서드를 구현할 수 있습니다.
// MarshalJSON implements the custom JSON Marshaler for MyStruct. func (ms MyStruct) MarshalJSON() ([]byte, error) { type Alias MyStruct if ms.Timestamp.IsZero() { return json.Marshal(struct{ Alias }{ms.Field}) } return json.Marshal(struct{ Alias }{Alias(ms)}) } // UnmarshalJSON implements the custom JSON Unmarshaler for MyStruct. func (ms *MyStruct) UnmarshalJSON(b []byte) error { type Alias MyStruct var as Alias if err := json.Unmarshal(b, &as); err != nil { return err } ms.Field = as.Field if !as.Timestamp.IsZero() { ms.Timestamp = &as.Timestamp } return nil }
사용자 정의 Marshaler 및 Unmarshaler 메서드를 구현하려면 기본 JSON 직렬화 및 역직렬화 프로세스.
위 내용은 JSON 마샬링에서 Go의 `time.Time`으로 `omitempty`를 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!