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

Démarshalling des structures sql.NullTime dans Go

PHPz
PHPzavant
2024-02-09 14:42:091111parcourir

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

et

type PayinCount struct {
    DateShiftStart sql.NullTime    `json:"dateShiftStart"`
    DateShiftEnd   sql.NullTime    `json:"dateShiftend"`
}

Quand je traite le JSON suivant

{
    "dateShiftStart":"2023-10-16",
    "dateShiftEnd":"2023-10-23"
}

et

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

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

J'ai reçu le message suivant

{
    "message": "json: cannot unmarshal string into Go struct field PayinsCount.dateShiftStart of type sql.NullTime",
    "statusCode": 400
}

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

Ensuite, j'ai modifié PayinsCount pour utiliser NullDate

type PayinsCount struct {
    DateShiftStart NullDate      `json:"dateShiftStart,omitempty"`
    DateShiftEnd   NullDate      `json:"dateShiftend,omitempty"`
}

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
}

Maintenant, quand je traite le JSON suivant

{
    "dateShiftStart":"2023-10-16",
    "dateShiftEnd":"2023-10-23"
}

et

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

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

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}

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer