Maison >développement back-end >Golang >Comment gérer les valeurs SQL NULL dans JSON à l'aide des conversions de type Go ?

Comment gérer les valeurs SQL NULL dans JSON à l'aide des conversions de type Go ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-22 01:31:18367parcourir

How to Handle SQL NULL Values in JSON using Go Type Conversions?

Gestion JSON des valeurs SQL NULL avec les conversions de type Go

Alors que les types Go comme Int64 et String ne peuvent pas stocker de valeurs nulles, en utilisant sql.NullInt64 et sql.NullString permet cette fonctionnalité. Cependant, l'encodage de ces types au format JSON à l'aide du package json entraîne un format modifié par rapport aux types Int64 et String classiques.

Cette divergence se produit car les types sql.Null* sont eux-mêmes des structures, ce qui provoque un niveau supplémentaire d'imbrication dans la représentation JSON. Pour surmonter ce problème, on peut implémenter des types personnalisés adhérant aux interfaces json.Marshaller et json.Unmarshaler.

Par exemple, le type JsonNullInt64 peut être défini, intégrant le type sql.NullInt64 et implémentant une gestion JSON personnalisée :

type JsonNullInt64 struct {
    sql.NullInt64
}

func (v JsonNullInt64) MarshalJSON() ([]byte, error) {
    if v.Valid {
        return json.Marshal(v.Int64)
    } else {
        return json.Marshal(nil)
    }
}

func (v *JsonNullInt64) UnmarshalJSON(data []byte) error {
    // Pointer unmarshalling ensures NULL detection
    var x *int64
    if err := json.Unmarshal(data, &x); err != nil {
        return err
    }
    if x != nil {
        v.Valid = true
        v.Int64 = *x
    } else {
        v.Valid = false
    }
    return nil
}

Remplacer sql.NullInt64 par JsonNullInt64 aboutit au codage JSON souhaité. Pour des tests plus approfondis, reportez-vous à ce terrain de jeu : http://play.golang.org/p/zFESxLcd-c

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:
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