«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как настроить демаршализацию нестандартных форматов времени JSON в Go?

Как настроить демаршализацию нестандартных форматов времени JSON в Go?

Опубликовано 23 декабря 2024 г.
Просматривать:322

How to Custom Unmarshal Non-Standard JSON Time Formats in Go?

Пользовательское отключение/маршалинг для нестандартных форматов времени 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