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     }

 

posted @ 2015-07-14 17:50  碎景  阅读(5591)  评论(0编辑  收藏  举报