>백엔드 개발 >Golang >JSON 마샬링에서 Go의 `time.Time`으로 `omitempty`를 처리하는 방법은 무엇입니까?

JSON 마샬링에서 Go의 `time.Time`으로 `omitempty`를 처리하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-18 17:55:10592검색

How to Handle `omitempty` with Go's `time.Time` in JSON Marshaling?

생략이 있는 시간 필드의 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.