Maison > développement back-end > Golang > Démarshalling des structures sql.NullTime dans Go

Démarshalling des structures sql.NullTime dans Go

PHPz
Libérer: 2024-02-09 14:42:09
avant
1215 Les gens l'ont consulté

在 Go 中解组 sql.NullTime 结构

éditeur php Xiaoxin Dans le langage Go, nous utilisons souvent la structure sql.NullTime pour traiter le champ horaire dans la base de données. La structure NullTime peut représenter une valeur temporelle nullable et est très adaptée à la gestion des valeurs nulles dans la base de données. Dans cet article, nous expliquerons comment désorganiser une structure sql.NullTime et comment gérer correctement les situations nulles qui peuvent exister en son sein. Que vous soyez débutant ou développeur expérimenté, cet article vous fournira des conseils clairs pour vous aider à mieux comprendre et utiliser la structure NullTime.

Contenu des questions

donné

type NullTime struct {
    Time  time.Time
    Valid bool // Valid is true if Time is not NULL
}
Copier après la connexion

et

type PayinCount struct {
    DateShiftStart sql.NullTime    `json:"dateShiftStart"`
    DateShiftEnd   sql.NullTime    `json:"dateShiftend"`
}
Copier après la connexion

Quand je traite le JSON suivant

{
    "dateShiftStart":"2023-10-16",
    "dateShiftEnd":"2023-10-23"
}
Copier après la connexion
Copier après la connexion

et

var payinsCount PayinsCount
err = json.Unmarshal(body, &payinsCount)
if err != nil {
    sendErrorResponse(w, err.Error(), http.StatusBadRequest)
    return
}
Copier après la connexion
Copier après la connexion

où sendErrorResponse est le processus auxiliaire suivant

func sendErrorResponse(w http.ResponseWriter, err string, statusCode int) {
    messageStatusCode := MessageStatusCode{
        Message:    err,
        StatusCode: statusCode}
    w.WriteHeader(statusCode)
    json.NewEncoder(w).Encode(messageStatusCode)
}
Copier après la connexion

J'ai reçu le message suivant

{
    "message": "json: cannot unmarshal string into Go struct field PayinsCount.dateShiftStart of type sql.NullTime",
    "statusCode": 400
}
Copier après la connexion

Comment résoudre ce problème ?

Solution de contournement

J'ai fini par utiliser ce qui suit. J'ai ajouté les types suivants.

type NullDate sql.NullTime
Copier après la connexion

Ensuite, j'ai modifié PayinsCount pour utiliser NullDate

type PayinsCount struct {
    DateShiftStart NullDate      `json:"dateShiftStart,omitempty"`
    DateShiftEnd   NullDate      `json:"dateShiftend,omitempty"`
}
Copier après la connexion

Puis j'ai créé

// UnmarshalJSON for NullDate
func (nd *NullDate) UnmarshalJSON(b []byte) error {
    s := string(b)
    s = strings.ReplaceAll(s, "\"", "")

    x, err := time.Parse(time.DateOnly, s)
    if err != nil {
        nd.Valid = false
        return err
    }

    nd.Time = x
    nd.Valid = true
    return nil
}
Copier après la connexion

Maintenant, quand je traite le JSON suivant

{
    "dateShiftStart":"2023-10-16",
    "dateShiftEnd":"2023-10-23"
}
Copier après la connexion
Copier après la connexion

et

var payinsCount PayinsCount
err = json.Unmarshal(body, &payinsCount)
if err != nil {
    sendErrorResponse(w, err.Error(), http.StatusBadRequest)
    return
}
Copier après la connexion
Copier après la connexion

Ça marche. Je me suis retrouvé avec une instance PayinsCount valide.

Pour être complet, voici la fonction MarshalJSON pour NullDate

// MarshalJSON for NullDate
func (nd NullDate) MarshalJSON() ([]byte, error) {
    if !nd.Valid {
        return []byte("null"), nil
    }
    val := fmt.Sprintf("\"%s\"", nd.Time.Format(time.DateOnly))
    return []byte(val), nil
}
Copier après la connexion

Notez les guillemets doubles échappés - sans eux, le code de marshaling d'encodage/json traite la chaîne de date en 3 morceaux et j'obtiens l'erreur suivante

error(*encoding/json.SyntaxError) *{msg: "invalid character '-' after top-level value", Offset: 0}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal