为什么 mgo 不能正确解组我的结构?
Why won't mgo unmarshall my struct properly?
早些时候我发布了 询问关于使用 mgo 在 Go 中编写自定义 BSON marshalling/unmarshalling。现在我来测试它,我想我遇到了一个更大的问题。我所有的结构都解组为零值。
这是我的货币结构,实现了 bson.Getter 和 bson.Setter:
type Currency struct {
value decimal.Decimal //The actual value of the currency.
currencyCode string //The ISO currency code.
}
/*
GetBSON implements bson.Getter.
*/
func (c Currency) GetBSON() (interface{}, error) {
f, _ := c.Value().Float64()
return bson.Marshal(struct {
Value float64 `json:"value" bson:"value"`
CurrencyCode string `json:"currencyCode" bson:"currencyCode"`
}{
Value: f,
CurrencyCode: c.currencyCode,
})
}
/*
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"`
})
fmt.Println(string(raw.Data))
bsonErr := raw.Unmarshal(decoded)
if bsonErr == nil {
fmt.Println("Debug: no error returned.")
fmt.Println(decoded)
c.value = decimal.NewFromFloat(decoded.Value)
c.currencyCode = decoded.CurrencyCode
return nil
} else {
return bsonErr
}
}
通过查看原始数据,它可以正确编组,但在解组时生成的结构只是空的。我在这里出错的任何想法?我昨天确实使用了 go get gopkg.in/mgo.v2
命令,所以我希望它是最新的,这样的错误不会出现在 "the hottest MongoDB driver around".
中
GetBSON 方法应该return 要编组的值,而不是编组产生的二进制数据。这就是为什么它的第一个结果类型是 interface{}
而不是 []byte
.
早些时候我发布了
这是我的货币结构,实现了 bson.Getter 和 bson.Setter:
type Currency struct {
value decimal.Decimal //The actual value of the currency.
currencyCode string //The ISO currency code.
}
/*
GetBSON implements bson.Getter.
*/
func (c Currency) GetBSON() (interface{}, error) {
f, _ := c.Value().Float64()
return bson.Marshal(struct {
Value float64 `json:"value" bson:"value"`
CurrencyCode string `json:"currencyCode" bson:"currencyCode"`
}{
Value: f,
CurrencyCode: c.currencyCode,
})
}
/*
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"`
})
fmt.Println(string(raw.Data))
bsonErr := raw.Unmarshal(decoded)
if bsonErr == nil {
fmt.Println("Debug: no error returned.")
fmt.Println(decoded)
c.value = decimal.NewFromFloat(decoded.Value)
c.currencyCode = decoded.CurrencyCode
return nil
} else {
return bsonErr
}
}
通过查看原始数据,它可以正确编组,但在解组时生成的结构只是空的。我在这里出错的任何想法?我昨天确实使用了 go get gopkg.in/mgo.v2
命令,所以我希望它是最新的,这样的错误不会出现在 "the hottest MongoDB driver around".
GetBSON 方法应该return 要编组的值,而不是编组产生的二进制数据。这就是为什么它的第一个结果类型是 interface{}
而不是 []byte
.