在Go中,我得到了json编组/解组。如果结构或类型具有MarshalJSON方法,则在另一个具有前者作为字段的结构上调用json.Marshal时,将调用结构的MarshalJSON方法。因此,从我收集和实践中看到的......
type MyType struct
有一个MarshalJSON方法来编组一个字符串。type MyDocument struct
将MyType
作为字段。json.Marshal()
上致电MyDocument
时,由于MyType
实施json.Marshaller
,bson.Getter
字段将被整理为字符串。我正在尝试使我的系统与数据库无关,并且正在使用mgo驱动程序为MongoDB实现一项服务,这意味着在所有结构上实现bson.Setter
和type Currency decimal.Decimal
以及我想要编组的所有内容具体方式。这是令人困惑的地方。
因为Go没有原生定点算术,所以我使用Shopspring的十进制包(找到here)来处理货币值。完美地对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。
这些是我的实现,它将小数转换为float64并尝试编组,就像我为json所做的那样:
//Following is the Constructor
public UnitOfWork(IEmployeeContext context)
{
this._context = context;
}
#endregion
public void Dispose()
{
this._context.Dispose();
}
public void Commit()
{
this._context.SaveChanges();
}
public IEmployeeRepository EmployeeRepository
{
{
return _employeeRepository??
(_employeeRepository= new EmployeeRepository(_context));
}
}
只有问题出在bson包的文档中:
Marshal序列化in值,可以是map或struct value。
因为它不是结构或地图,所以只生成一个空文档。
我只是试图编组一些数据,这些数据只需要作为较大结构的一部分进行编组,但该程序包只允许我在整个文档中执行此操作。我该怎么做才能得到我需要的结果?