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