Пользовательское отключение/маршалинг для нестандартных форматов времени JSON
При работе с данными 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"))
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3