Marshaling BSON personnalisé : équivalents pour le marshaling JSON personnalisé
Pour réaliser un marshaling BSON personnalisé, similaire au marshaling JSON personnalisé démontré avec la structure Currency , vous pouvez utiliser les interfaces bson.Getter et bson.Setter. Ces interfaces permettent de personnaliser la façon dont les valeurs sont codées et décodées au format BSON.
Implémentation d'un getter et d'un setter BSON personnalisés
La structure de devise peut être mise à jour pour implémenter le Interfaces bson.Getter et bson.Setter comme suit :
// Currency struct implements bson.Getter and bson.Setter type Currency struct { value decimal.Decimal currencyCode string } // GetBSON implements bson.Getter. func (c Currency) GetBSON() (interface{}, error) { value := c.Value().Float64() return struct { Value float64 `json:"value" bson:"value"` CurrencyCode string `json:"currencyCode" bson:"currencyCode"` }{ Value: value, 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 { return bsonErr } c.value = decimal.NewFromFloat(decoded.Value) c.currencyCode = decoded.CurrencyCode return nil }
Utilisation du marshaling BSON personnalisé dans les structures parent
Une fois la structure de devise mise à jour, similaire au marshaling JSON personnalisé, la structure Product qui intègre le Le champ Devise utilisera automatiquement le marshaling personnalisé lors de l’appel de mgo.Marshal ou bson.Encode. Le BSON de sortie contiendra les noms de champs et les valeurs de données souhaités sans avoir besoin d'une structure distincte avec les champs exportés.
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!