Maison > développement back-end > Golang > Comment implémenter un marshalling BSON personnalisé dans Go pour MongoDB ?

Comment implémenter un marshalling BSON personnalisé dans Go pour MongoDB ?

Linda Hamilton
Libérer: 2024-12-04 11:30:12
original
613 Les gens l'ont consulté

How to Implement Custom BSON Marshalling in Go for MongoDB?

Gestion du marshaling BSON personnalisé dans Go

Lorsque vous traitez des structures de données personnalisées dans le contexte de MongoDB, il devient nécessaire d'implémenter un marshaling personnalisé et logique de démarshaling pour garantir la représentation et le traitement corrects des données au format BSON. À cet égard, Go fournit des interfaces telles que bson.Getter et bson.Setter, qui permettent le marshaling et le démarshaling personnalisés de types de données spécifiques.

Considérez l'exemple suivant, où une structure de devise est définie avec MarshalJSON et UnmarshalJSON personnalisés. méthodes pour gérer l'encodage et le décodage JSON :

type Currency struct {
    value        decimal.Decimal //The actual value of the currency.
    currencyCode string          //The ISO currency code.
}

// MarshalJSON implements json.Marshaller.
func (c Currency) MarshalJSON() ([]byte, error) {
    f, _ := c.Value().Float64()
    return json.Marshal(struct {
        Value        float64 `json:"value" bson:"value"`
        CurrencyCode string  `json:"currencyCode" bson:"currencyCode"`
    }{
        Value:        f,
        CurrencyCode: c.CurrencyCode(),
    })
}

// UnmarshalJSON implements json.Unmarshaller.
func (c *Currency) UnmarshalJSON(b []byte) error {

    decoded := new(struct {
        Value        float64 `json:"value" bson:"value"`
        CurrencyCode string  `json:"currencyCode" bson:"currencyCode"`
    })

    jsonErr := json.Unmarshal(b, decoded)

    if jsonErr == nil {
        c.value = decimal.NewFromFloat(decoded.Value)
        c.currencyCode = decoded.CurrencyCode
        return nil
    } else {
        return jsonErr
    }
}
Copier après la connexion

Pour réaliser un marshaling BSON personnalisé, une approche similaire peut être utilisé en implémentant les interfaces bson.Getter et bson.Setter dans la structure monétaire :

// GetBSON implements bson.Getter.
func (c Currency) GetBSON() (interface{}, error) {
    f := c.Value().Float64()
    return struct {
        Value        float64 `json:"value" bson:"value"`
        CurrencyCode string  `json:"currencyCode" bson:"currencyCode"`
    }{
        Value:        f,
        CurrencyCode: c.currencyCode,
    }, nil
}

// SetBSON implements bson.Setter.
func (c *Currency) SetBSON(raw bson.Raw) error {

    decoded := new(struct {
        Value        float64 `json:"value" bson:"value"`
        CurrencyCode string  `json:"currencyCode" bson:"currencyCode"`
    })

    bsonErr := raw.Unmarshal(decoded)

    if bsonErr == nil {
        c.value = decimal.NewFromFloat(decoded.Value)
        c.currencyCode = decoded.CurrencyCode
        return nil
    } else {
        return bsonErr
    }
}
Copier après la connexion

En implémentant ces interfaces, la structure monétaire dispose désormais d'une logique de marshaling BSON personnalisée qui mappe ses champs à la représentation BSON souhaitée , gérant efficacement les types de données personnalisés dans un contexte MongoDB.

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!

source:php.cn
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal