MongoDB数据实体中的ObjectId序列化成json的一个小坑

  很多时候我们都需要对实体对象进行序列化与反序列化,而ObjectId类型,只能用mongo的驱动以bson格式来序列化,但我们对外的交互,一般是json格式.

有两种解决方案:

  1.自己写一个json.net的ObjectIdConverter来针对ObjectId,适用于json.net

  2.增加string类型的中间变量IdStr ,优点是适用于所有情况,比如mvc自带的序列化工具等

测试代码如下:

  1  [TestClass]
  2     public class MongoTest
  3     {
  4         [TestMethod()]
  5         public void Temp1()
  6         {
  7             var entity = new MyEntity()
  8             {
  9                 Id = new ObjectId("555afe4204cbee061cc31b6f"),
 10                 Name = "ZhangSan"
 11             };
 12             var str = JsonConvert.SerializeObject(entity);//{"Id":"555afe4204cbee061cc31b6f","Name":"ZhangSan"}
 13             var entity1 = JsonConvert.DeserializeObject<MyEntity>(str);
 14         }
 15
 16         [TestMethod()]
 17         public void Temp2()
 18         {
 19             var entity = new MyEntity2()
 20             {
 21                 Id = new ObjectId("555afe4204cbee061cc31b6f"),
 22                 Name = "ZhangSan"
 23             };
 24             var str = JsonConvert.SerializeObject(entity); //{"IdStr":"555afe4204cbee061cc31b6f","Name":"ZhangSan"}
 25             var entity2 = str.FromJson<MyEntity2>();
 26         }
 27
 28         [TestMethod()]
 29         public void Temp3()
 30         {
 31             var entity = new MyEntity3()
 32             {
 33                 Id = new ObjectId("555afe4204cbee061cc31b6f"),
 34                 Name = "ZhangSan"
 35             };
 36             var str = JsonConvert.SerializeObject(entity); //{"Id":"555afe4204cbee061cc31b6f","Name":"ZhangSan"}
 37             var entity2 = str.FromJson<MyEntity3>();
 38         }
 39     }
 40
 41     public class MyEntity
 42     {
 43         public virtual ObjectId Id { get; set; }
 44         public virtual string Name { get; set; }
 45     }
 46
 47     public class MyEntity2 : MyEntity
 48     {
 49         [JsonIgnore]
 50         public override  ObjectId Id { get; set; }
 51
 52         [BsonIgnore]
 53         public string IdStr
 54         {
 55             get
 56             {
 57                 return Id.ToString();
 58             }
 59             set
 60             {
 61                 ObjectId id;
 62                 ObjectId.TryParse(value, out id);
 63                 Id = id;
 64             }
 65         }
 66     }
 67
 68     public class MyEntity3 : MyEntity
 69     {
 70         [JsonConverter(typeof(ObjectIdConverter))]
 71         public override ObjectId Id { get; set; }
 72     }
 73     public class ObjectIdConverter : JsonConverter
 74     {
 75         public override bool CanConvert(Type objectType)
 76         {
 77             return objectType == typeof(ObjectId);
 78         }
 79
 80         public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
 81         {
 82             if (reader.TokenType != JsonToken.String)
 83             {
 84                 throw new Exception(
 85                     String.Format("Unexpected token parsing ObjectId. Expected String, got {0}.",
 86                                   reader.TokenType));
 87             }
 88
 89             var value = (string)reader.Value;
 90             return String.IsNullOrEmpty(value) ? ObjectId.Empty : new ObjectId(value);
 91         }
 92
 93         public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
 94         {
 95             if (value is ObjectId)
 96             {
 97                 var objectId = (ObjectId)value;
 98
 99                 writer.WriteValue(objectId != ObjectId.Empty ? objectId.ToString() : String.Empty);
100             }
101             else
102             {
103                 throw new Exception("Expected ObjectId value.");
104             }
105         }
106     }
时间: 2025-01-17 20:08:00

MongoDB数据实体中的ObjectId序列化成json的一个小坑的相关文章

NET Framework 3 5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON

分享一下我老师大神的人工智能教程吧.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net 原贴地址:http://bbs.zkinfo.com/thread-80510-1-1.html 最近要用到jQuery调用JSON,但遇到几个问题,正面将记录下遇到的问题及解决方法. 在将Object序列化成JSON时普遍是使用以下几种方式: 1. 第三方组件Newtonsoft.Json.dll来序列化. 2. 直接用Strin

javascript中字符串格式转化成json对象记录

什么是JSON JSON(JavaScript Object Notation)是一种优美的JavaScript对象创建方法.JSON也是一种轻量级数据交换格式.JSON非常易于人阅读与编写,同时利于机器解析与生成.JSON是在AJAX中代替XML交换数据的更佳方案. JSON格式与语法 var jsonobject= {         //对象内的属性语法(属性名与属性值是成对出现的)         propertyname:value, //对象内的函数语法(函数名与函数内容是成对出现的

使用 EntityFramework后把一个对象序列化成json字符串引起循环引用的问题

先看一个T4模板生成的model实体类 1 著作权归作者所有. 2 商业转载请联系作者获得授权,非商业转载请注明出处. 3 作者:卷猫 4 链接:http://anneke.cn/ArticleInfo/Detial/15 5 来源:Anneke.cn 6 7 //------------------------------------------------------------------------------ 8 // <auto-generated> 9 // 此代码已从模板生成.

iOS网络: 把Array和Dictionaries序列化成JSON对象

你想把 Array 和 dictionary 序列化成 JSON 对象.以方便在网络中传输或者保存到磁盘中. 方案: 使用 NSJSONSerialization 这个类的 dataWithJSONObject:options:error:方法来实现. 讨论: NSJSONSerialization 这个类的 dataWithJSONObject:options:error:方法可以对数组和字典进行序列化,这些数组和字典包含的值为:NSString.NSNumber.NSArray.NSDict

Json数据序列化对象,及对象序列化为Json格式

public class JsonHelper { /// <summary> /// 生成Json格式 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="obj"></param> /// <returns></returns> public static string GetJso

JavaScriptSerializer序列化成Json时DateTime类型数据的处理

JavaScriptSerializer在序列化时会将DateTime的数据序列化成类似\/Date(626543800000)\/这样的值,找了很多方法都不如意,最后在一个博客找到了完美的解决方法,地址:http://blog.calyptus.eu/seb/2011/12/custom-datetime-json-serialization/,通过自定义类型转换器的方式转换成想要的格式,转换器代码如下: + ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1

用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。

最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量.<s:iterator>标签有一个value属性,用来存放在Action类的方法中存数据的list集合,还有一个id,好像是说指定集合的索引的意思,就是给list集合遍历出来的每个对象加上一个数字标签,反正我是这么理解的,没用过.还有一个很重要,就是var变量,我在s:iterator按ctr

DEV中的TreeList控件应用的一个小效果实现【转载】

我使用最多的DEV控件就是这个TreeList啦,当然用好它很不简单,如果用好它,能做出很精彩的树形层次结构图.TreeList控件很强大,以至于你看DEV自带的DEMO,也得浪费你很长时间应用.DEV控件的DEMO只是告诉你有些什么功能,只是抛砖引玉,决不能照搬DEMO! 用好TreeList控件绝对会让你的软件锦上添花!精益求精促使我总想用TreeList实现出更好的效果,但对TreeList控件的每一步深入学习,都需要花费不要时间和精力.现在记录一下我学习使用该控件的一个小功能的过程. 就

可能你不知道的字符串中的一个小坑!!!

简单的记录一个小问题,一直居然都没怎么注意,心底对自己深深的说了一句:"你真菜"! 平时日常我们接触到的数组去重太常见了.然后对于字符串的去重,也是可能用的IndexOf.或者转成数组去查重,然后再转换回来! 在尝试用其他方法的时候遇见一个小问题,在此记录下来与大家分析! var str = '521213756406'; for(var i = 0; i < str.length-1;i++){ for(var j = i+1;j < str.length; j++){