JSON: маршалинг, немаршалинг, кастомная обработка

К вопросам
Легкий
Data Formats

Вопрос

Как работать с 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, &timestamp); 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, &timestamp); err != nil {
        return err
    }
    *t = Time(time.Unix(timestamp, 0))
    return nil
}

Дополнительные вопросы

Как работать с неизвестной структурой JSON? Что такое json.RawMessage?