在Go中,我得到了json编组/解组 . 如果结构或类型具有MarshalJSON方法,则在另一个具有前者作为字段的结构上调用json.Marshal时,将调用结构的MarshalJSON方法 . 从我收集到的并在实践中看到的......
-
type MyType struct
有一个MarshalJSON方法来编组自己的字符串 . -
type MyDocument struct
已将MyType
作为字段 . -
在
MyDocument
上调用json.Marshal()
时,MyType
字段将作为字符串进行编组,因为它实现了json.Marshaller
.
我正在尝试使我的系统与数据库无关,并且正在使用mgo驱动程序为MongoDB实现服务,这意味着在所有结构上实现 bson.Getter
和 bson.Setter
以及我想要以特定方式编组的东西 . 这是令人困惑的地方 .
因为Go并没有使用Shopspring的十进制包(找到here)来处理货币值 . 十进制编组到JSON完美但我有一个命名类型 type Currency decimal.Decimal
,我无法编组到BSON .
这些是我的实现,它将十进制转换为float64并尝试编组,就像我为json所做的那样:
/*
Implements the bson.Getter interface.
*/
func (c Currency) GetBSON() (interface{}, error) {
f, _ := decimal.Decimal(c).Float64()
return f, nil
}
/*
Implements the bson.Setter interface.
*/
func (c *Currency) SetBSON(raw bson.Raw) error {
var f float64
e := raw.Unmarshal(&f)
if e == nil {
*c = Currency(decimal.NewFromFloat(f))
}
return e
}
唯一的问题是在bson包的文档中:
Marshal序列化in值,可以是map或struct值 .
因为它不是结构或 Map ,所以它只生成一个空文档 .
我只是试图编组一些数据,这些数据只需要作为较大结构的一部分进行编组,但是程序包只允许我在整个文档中执行此操作 . 我该怎么做才能得到我需要的结果?