>백엔드 개발 >Golang >Go에서 비표준 JSON 시간 형식을 사용자 정의 비정렬화하는 방법은 무엇입니까?

Go에서 비표준 JSON 시간 형식을 사용자 정의 비정렬화하는 방법은 무엇입니까?

DDD
DDD원래의
2024-11-16 14:48:02461검색

How to Custom Unmarshal Non-Standard JSON Time Formats in Go?

비표준 JSON 시간 형식에 대한 사용자 정의 Un/Marshaling

비표준 형식의 시간 값이 포함된 JSON 데이터를 처리할 때, 내장 JSON 디코더에 오류가 발생할 수 있습니다. 이러한 상황을 처리하려면 사용자 정의 마샬링 및 역마샬링 기능을 구현할 수 있습니다.

다음 JSON을 고려하세요.

{
    "name": "John",
    "birth_date": "1996-10-07"
}

그리고 원하는 Go 구조체:

type Person struct {
    Name string `json:"name"`
    BirthDate time.Time `json:"birth_date"`
}

사용 표준 JSON 디코더에서는 "birth_date" 필드를 구문 분석하는 동안 오류가 발생합니다. 이 동작을 사용자 정의하려면 유형 별칭을 생성하고 구조체에 추가할 수 있습니다.

type JsonBirthDate time.Time

그런 다음 사용자 정의 마샬링 및 역마샬링 함수가 구현됩니다.

func (j *JsonBirthDate) UnmarshalJSON(b []byte) error {
    s := strings.Trim(string(b), `"`) // Remove quotes
    t, err := time.Parse("2006-01-02", s)
    if err != nil {
        return err
    }
    *j = JsonBirthDate(t)
    return nil
}

func (j JsonBirthDate) MarshalJSON() ([]byte, error) {
    return json.Marshal(time.Time(j))
}

이러한 사용자 정의 함수를 사용하면, 이제 JSON을 의도한 대로 Go 구조체로 디코딩할 수 있습니다.

person := Person{}

decoder := json.NewDecoder(req.Body);

if err := decoder.Decode(&person); err != nil {
    log.Println(err)
}

// Print the birth date using the Format function
fmt.Println(person.BirthDate.Format("2006-01-02"))

위 내용은 Go에서 비표준 JSON 시간 형식을 사용자 정의 비정렬화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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