我正在玩MongoDB,有一个对象上面有一个mongodb ObjectId,当我用.NET Json()方法序列化这个对象时,一切都很好(但是日期太可怕了!)
如果我用JSON .NET序列化器尝试这个,当我尝试序列化ObjectID时,它会给我一个InvalidCastException
有什么想法发生了什么事,我怎么能解决这个问题?
using MongoDB.Driver;
using MongoDB.Bson;
using Newtonsoft.Json;
//this is a route on a controller
public string NiceJsonPlease()
{
var q = new TestClass();
q.id = new ObjectId();
q.test = "just updating this";
return JsonConvert.SerializeObject(q);
}
//simple test class
class TestClass
{
public ObjectId id; //MongoDB ObjectID
public string test = "hi there";
}
Exception Details: System.InvalidCastException: Specified cast is not valid.
如果您将控制器方法更改为使用.NET附带的序列化程序,它可以正常工作(但是,这个方法给出了难看的日期,blugh)
public JsonResult NiceJsonPlease()
{
var q = new TestClass();
q.id = new ObjectId();
q.test = "just updating this";
return Json(q, JsonRequestBehavior.AllowGet);
}
7条答案
按热度按时间7eumitmz1#
你可以使用.NET字符串类型来代替ObjectId,你只需要用BsonRepresentation来修饰它。如果你使用BsonDateTime,你将有同样的转换问题。这是我的项目中的一个域类,它使用了那些装饰器。
8ftvxx2r2#
我有一个来自MongoDB用户组的指针。https://groups.google.com/forum/?fromgroups =#!主题/mongodb-csharp/A_DXHuPscnQ
回答是
这似乎是Json .NET的问题,但实际上不是。这里有一个它根本不知道的自定义类型。您需要告诉Json .NET如何序列化ObjectId。
因此,我实现了以下解决方案
我用
然后编写了一个自定义转换器,它只输出ObjectId的Guid部分
yquaqz183#
1.写入ObjectId转换器
公共类对象标识转换器:公共重写bool可以转换(类型对象类型){返回对象类型==类型(对象ID);}
}
1.使用全局设置在JSON.NET中全局注册它,并且不需要用大属性标记模型
1.重要建议-不要在模型中使用ObjectId-使用字符串
[BsonRepresentation(BsonType.ObjectId)]公共字符串Id {get;设置;}
4xrmg8kj4#
我通过将JsonOutputMode设置为strict解决了JSON.NET序列化程序/InvalidCastException错误中遇到的类似问题,这消除了更改底层类型的需要:
API中提供了更多信息:http://api.mongodb.org/csharp/1.8.3/html/d73bf108-d68c-e472-81af-36ac29ea08da.htm
mznpcxlj5#
我在一个WebAPI项目中遇到了类似的问题,在找到这个线程之前,我的头在键盘上敲打了几个小时。
最初一切正常,但在将代码转换为使用自己的自定义类而不是mongoDB C#驱动程序文档中推荐的BsonDocument对象后,我遇到了这个问题。
http://docs.mongodb.org/ecosystem/tutorial/getting-started-with-csharp-driver/#bsondocument-object-model-vs-your-own-domain-classes
这里的VB.net等同于上面的解决方案,为那些需要它;
hrirmatl6#
还有另一个选择
fzsnzjdm7#
我在VB.NET中使用了这段代码,效果很好,你可以在类中看到objectId,你可以对数据类型DATE做同样的事情。