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     }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM