Теги: json:"fieldname", omitempty, - (игнор). Кастомная сериализация: реализовать json.Marshaler и json.Unmarshaler (методы с указателем на тип). Для типа Time часто оборачивают в свой тип с нужным форматом. Для сложных правил можно использовать интерфейсы и type switch при unmarshal.
func (t Time) MarshalJSON() ([]byte, error) {
return json.Marshal(t.Format(time.RFC3339))
}
func (t *Time) UnmarshalJSON(data []byte) error { ... }