"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como personalizar formatos de hora JSON não padrão de desempacotamento no Go?

Como personalizar formatos de hora JSON não padrão de desempacotamento no Go?

Publicado em 23/12/2024
Navegar:919

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

Un/Marshaling personalizado para formatos de hora JSON não padrão

Ao lidar com dados JSON que contêm valores de hora em formatos não padrão, o decodificador JSON integrado pode encontrar erros. Para lidar com essas situações, funções personalizadas de empacotamento e desempacotamento podem ser implementadas.

Considere o seguinte JSON:

{
    "name": "John",
    "birth_date": "1996-10-07"
}

E a estrutura Go desejada:

type Person struct {
    Name string `json:"name"`
    BirthDate time.Time `json:"birth_date"`
}

O uso do decodificador JSON padrão resultaria em um erro ao analisar o campo "data_de_nascimento". Para personalizar esse comportamento, um alias de tipo pode ser criado e adicionado à estrutura:

type JsonBirthDate time.Time

Em seguida, as funções personalizadas de empacotamento e desempacotamento são implementadas:

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))
}

Com essas funções personalizadas, o JSON agora pode ser decodificado na estrutura Go conforme pretendido:

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"))
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3