> 백엔드 개발 > Golang > 비RFC 3339 형식을 처리하기 위해 Go에서 JSON 시간 역마샬링을 어떻게 사용자 정의할 수 있나요?

비RFC 3339 형식을 처리하기 위해 Go에서 JSON 시간 역마샬링을 어떻게 사용자 정의할 수 있나요?

Linda Hamilton
풀어 주다: 2024-12-18 21:09:13
원래의
1006명이 탐색했습니다.

How Can I Customize JSON Time Unmarshaling in Go to Handle Non-RFC 3339 Formats?

Go에서 JSON 시간 언마샬링 사용자 정의

시간 값이 포함된 JSON 데이터를 처리할 때 Go의 인코딩/json 패키지가 제한될 수 있습니다. 시간 형식이 RFC 3339를 준수하지 않는 경우. 시간을 RFC 3339 형식으로 수동으로 변환할 수는 있지만 구문 분석에는 더 효율적인 접근 방식이 있습니다.

Marshaler/Unmarshaler 인터페이스 구현

사용자 정의 시간 형식을 처리하려면 json.Marshaler 및 json을 구현하는 사용자 정의 유형을 생성하세요. 언마샬러 인터페이스. 이를 통해 시간 값을 직렬화 및 역직렬화하는 방법을 정의할 수 있습니다.

다음은 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()
}
로그인 후 복사

이 사용자 정의 유형의 경우:

  • UnmarshalJSON은 지정된 사용자 정의를 사용하여 JSON 문자열을 time.Time 값으로 변환합니다. 레이아웃.
  • MarshalJSON은 동일한 사용자 정의 레이아웃을 사용하여 time.Time 값을 JSON 문자열로 변환합니다.
  • IsSet는 CustomTime 값이 설정되었는지(0이 아님) 확인하는 선택적 방법입니다.

사용방법

일회 CustomTime 유형이 정의되어 사용자 정의 시간 형식으로 JSON 데이터를 역직렬화하는 구조체 필드로 사용할 수 있습니다.

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())
}
로그인 후 복사

이 예는 Time 필드가 사용자 정의 "2006/01에 있는 JSON 데이터를 성공적으로 역직렬화합니다. /02|15:04:05" 형식입니다.

위 내용은 비RFC 3339 형식을 처리하기 위해 Go에서 JSON 시간 역마샬링을 어떻게 사용자 정의할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿