Maison >développement back-end >Golang >Démarshalling des structures sql.NullTime dans Go
é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.
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 ?
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!