From 3b9f84a311d8b9bae45e87f1cb8d03e789191b40 Mon Sep 17 00:00:00 2001 From: Stuart Auld Date: Wed, 22 Aug 2018 07:31:52 +1000 Subject: [PATCH] Added README to explain how to support custom types (#149) (#150) * Added README to explain how to support custom types (#149) * Fix incorrect docstring --- README.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/README.md b/README.md index 44b0541..c599dd3 100644 --- a/README.md +++ b/README.md @@ -343,6 +343,37 @@ func (post Post) JSONAPIRelationshipMeta(relation string) *Meta { } ``` +### Custom types + +If you need to support custom types (e.g. for custom time formats), you'll need to implement the json.Marshaler and json.Unmarshaler interfaces on the type. + +```go +// MyTimeFormat is a custom format I invented for fun +const MyTimeFormat = "The time is 15:04:05. The year is 2006, and it is day 2 of January." + +// MyTime is a custom type used to handle the custom time format +type MyTime struct { + time.Time +} + +// UnmarshalJSON to implement the json.Unmarshaler interface +func (m *MyTime) UnmarshalJSON(b []byte) error { + t, err := time.Parse(MyTimeFormat, string(b)) + if err != nil { + return err + } + + m.Time = t + + return nil +} + +// MarshalJSON to implement the json.Marshaler interface +func (m *MyTime) MarshalJSON() ([]byte, error) { + return json.Marshal(m.Time.Format(MyTimeFormat)) +} +``` + ### Errors This package also implements support for JSON API compatible `errors` payloads using the following types.