Разбор нестандартного формата времени из JSON
При декодировании данных JSON в пользовательскую структуру могут возникнуть несоответствия в форматах дат. Чтобы решить эту проблему, Golang предоставляет возможность реализации пользовательских функций маршалирования и демаршалинга.
Пользовательские функции маршалера и демаршалинга
Чтобы указать собственный формат синтаксического анализа, псевдоним типа имеет вид создается для поля времени, а интерфейсы Marshaler и Unmarshaler реализованы следующим образом:
type JsonBirthDate time.Time // UnmarshalJSON translates a JSON string to a time value. func (j *JsonBirthDate) UnmarshalJSON(b []byte) error { s := strings.Trim(string(b), `"`) t, err := time.Parse("2006-01-02", s) if err != nil { return err } *j = JsonBirthDate(t) return nil } // MarshalJSON converts a time value to a JSON string. func (j JsonBirthDate) MarshalJSON() ([]byte, error) { return json.Marshal(time.Time(j)) }
Эта пользовательская логика проверяет, соответствует ли значение JSON нужному формату, и соответствующим образом анализирует его.
Обновленная структура и синтаксический анализ
Структура обновлен для использования пользовательского типа, и декодирование может продолжаться как обычно:
type Person struct { Name string `json:"name"` BirthDate JsonBirthDate `json:"birth_date"` } decoder := json.NewDecoder(req.Body) if err := decoder.Decode(&person); err != nil { log.Println(err) }
Дополнительные функции
Для удобства можно добавить метод Format, обеспечивающий форматированное представление даты:
// Format prints the date using the specified format string. func (j JsonBirthDate) Format(s string) string { t := time.Time(j) return t.Format(s) }
Этот индивидуальный подход к маршалингу и демаршалингу позволяет гибко анализировать значения времени из JSON, даже если они отличаются от стандартных форматов.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3