当前位置:Gxlcms >
数据库问题 >
MongoDB数据实体中的ObjectId序列化成json的一个小坑
MongoDB数据实体中的ObjectId序列化成json的一个小坑
时间:2021-07-01 10:21:17
帮助过:3人阅读
[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 }
MongoDB数据实体中的ObjectId序列化成json的一个小坑
标签: