비RFC 3339 시간 형식에 대한 사용자 정의 JSON 역마샬링
Go의 인코딩/json 패키지는 다음과 같은 경우 RFC 3339 시간 형식을 엄격하게 준수합니다. JSON 데이터를 역직렬화합니다. 이는 이 표준에서 벗어나는 시간 형식을 처리할 때 불편할 수 있습니다.
해결책: 사용자 정의 마샬러 및 역마샬러 구현
기존 JSON 데이터를 수정하거나 이에 의존하는 대신 중간 변환 단계에서 더 적합한 솔루션은 사용자 정의에 json.Marshaler 및 json.Unmarshaler 인터페이스를 구현하는 것입니다. type.
다음 예에서는 RFC 3339가 아닌 특정 시간 형식의 역직렬화를 처리하는 사용자 정의 유형(CustomTime)을 생성하는 방법을 보여줍니다.
import ( "fmt" "strconv" "strings" "time" "github.com/golang/protobuf/ptypes/timestamp" ) 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() } type Args struct { Time CustomTime } var data = ` {"Time": "2014/08/01|11:27:18"} ` func main() { a := Args{} if err := json.Unmarshal([]byte(data), &a); err != nil { fmt.Println("Error unmarshaling: ", err) return } if !a.Time.IsSet() { fmt.Println("Time not set") } else { fmt.Println(a.Time.String()) } }
참고: CustomTime.IsSet() 메서드는 Time 필드가 0이 아닌지 확인하여 시간 값이 실제로 설정되었는지 또는 그렇지 않습니다.
사용자 정의 Marshaler 및 Unmarshaler를 구현하면 RFC 3339 표준에서 벗어날 수 있는 시간 형식을 처리할 수 있는 유연성을 얻을 수 있으므로 Go에서 원활한 JSON 데이터 역직렬화가 가능합니다.
위 내용은 Go에서 JSON을 언마샬링할 때 비RFC 3339 시간 형식을 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!