我在玩MongoDB,有一个对象上面有一个MongoDB ObjectId.

如果我try 使用JSON.NET serialisertry 序列化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,它运行正常(但是,这一个给出了丑陋的日期,布拉)

public JsonResult NiceJsonPlease()
    {

        var q = new TestClass();
        q.id = new ObjectId();
        q.test = "just updating this";

        return Json(q, JsonRequestBehavior.AllowGet);
    }

推荐答案

我有一个来自MongoDB用户组的指针.

回应是

这似乎是一个Json.净问题,但不是真的.有一种习俗

因此,我实现了以下解决方案

我用

[JsonConverter(typeof(ObjectIdConverter))]

然后编写了一个自定义转换器,只输出ObjectId的Guid部分

 class ObjectIdConverter : JsonConverter
{

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    { 
        serializer.Serialize(writer, value.ToString());
       
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override bool CanConvert(Type objectType)
    {
        return typeof(ObjectId).IsAssignableFrom(objectType);
        //return true;
    }


}

Mongodb相关问答推荐

字段$set聚合导致错误美元($)前缀字段$concatArrays对于存储无效"

没有文档的MongoDB集合中的不一致,但当我执行count()时,它告诉我有15个文档

Mongo 聚合查找 $gte 6 个月前的日期,以DD-MM-YYYY格式存储为字符串

如何向所有文档添加一个字段,其中前 100 个文档的值为 1,接下来的 100 个文档的值为 2,依此类推?

如何在 mongodb 中将一个方面的结果合并到一个有条件的列表中?

如何在 mongodb golang 的单个更新调用中使用 $set 和 $inc?

无法让 Mongoose.js 子文档数组填充

创建索引需要很长时间

MongoDB中的readPreference和readConcern有什么区别?

如何将记录从一个 mongo 数据库插入另一个?

是否可以迭代 mongo 游标两次?

在mongoose中添加多个验证

MongoDB插入引发重复键错误

从 mongodb 中的副本配置重新开始

如何在 mongo JavaScript shell 中中止查询

如何按季度分组日期?

MongoDB - 投影一个并不总是存在的字段

Mongodb:为什么 show dbs 不显示我的数据库?

如何在 Ubuntu 上安装 mongodb-clients 最新版本?

Mongodb 查找除一两个条件之外的所有内容