ホームページ >バックエンド開発 >Golang >MongoDB 用に Go でカスタム BSON マーシャリングを実装するにはどうすればよいですか?

MongoDB 用に Go でカスタム BSON マーシャリングを実装するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-04 11:30:12365ブラウズ

How to Implement Custom BSON Marshalling in Go for MongoDB?

Go でのカスタム BSON マーシャリングの処理

MongoDB のコンテキストでカスタム データ構造を扱う場合、カスタム マーシャリングとBSON 形式のデータの正しい表現と処理を保証するアンマーシャリング ロジック。この点に関して、Go は、特定のデータ型のカスタム マーシャリングおよびアンマーシャリングを可能にする bson.Getter や bson.Setter などのインターフェイスを提供します。

次の例を考えてみましょう。ここでは、Currency 構造体がカスタム MarshalJSON および UnmarshalJSON とともに定義されています。 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
    }
}

カスタム BSON マーシャリングを実現するには、 Currency 構造体に bson.Getter インターフェイスと bson.Setter インターフェイスを実装することで、同様のアプローチを使用できます。

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

これらのインターフェイスを実装することにより、Currency 構造体にはフィールドをマップするカスタム BSON マーシャリング ロジックが追加されました。目的の BSON 表現。MongoDB コンテキストでカスタム データ型を効果的に処理します。

以上がMongoDB 用に Go でカスタム BSON マーシャリングを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。