JSON: маршалинг, немаршалинг, кастомная обработка
Вопрос
Как работать с JSON в Go? Что такое struct tags? Как реализовать кастомную логику маршалинга?
Ответ
Работа с JSON: - json.Marshal() - сериализация в JSON - json.Unmarshal() - десериализация из JSON - Struct tags для настройки поведения - Интерфейсы json.Marshaler/json.Unmarshaler для кастомной логики Популярные tags: - json:"name" - изменить имя поля - json:"-" - исключить поле - json:",omitempty" - не включать нулевые значения
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Email string `json:"email,omitempty"`
Password string `json:"-"` // не экспортируется
}
// Кастомный маршалинг
type Time time.Time
func (t Time) MarshalJSON() ([]byte, error) {
return json.Marshal(time.Time(t).Unix())
}
func (t *Time) UnmarshalJSON(data []byte) error {
var timestamp int64
if err := json.Unmarshal(data, ×tamp); err != nil {
return err
}
*t = Time(time.Unix(timestamp, 0))
return nil
}
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Email string `json:"email,omitempty"`
Password string `json:"-"` // не экспортируется
}
// Кастомный маршалинг
type Time time.Time
func (t Time) MarshalJSON() ([]byte, error) {
return json.Marshal(time.Time(t).Unix())
}
func (t *Time) UnmarshalJSON(data []byte) error {
var timestamp int64
if err := json.Unmarshal(data, ×tamp); err != nil {
return err
}
*t = Time(time.Unix(timestamp, 0))
return nil
}
Дополнительные вопросы
Как работать с неизвестной структурой JSON? Что такое json.RawMessage?