Json.NET反序列化Mongo ObjectId给出了错误的结果

我正在使用官方的Mongo C#Driver和RestSharp用Json.NET调用Rest Api来执行序列化/反序列化。 假设我有一个Person类,如下所示,我想POST&GET:

public class Person { [JsonProperty("_id"),JsonConverter(typeof(ObjectIdConverter))] public ObjectId Id {get;set;} public string Name {get;set;} } 

我创建一个新的Person对象:

 var person = new Person{Id = ObjectId.GenerateId(),Name='Joe Bloggs'}; 

发布它,在服务器上我看到以下是正确的:

 { _id: 52498b56904ee108c99fbe88, name: 'Joe Bloggs'} 

问题是,当我执行GET时,我在客户端上获得的ObjectId是{0000000000000 …},即不是{5249 …..}我期望的。 原始响应显示正确的值,但是一旦我反序列化,我就会松开它。

ObjectIdConverter代码是:

 public 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) { var objectId = (ObjectId)existingValue; // at this point existingValue is {000...} return objectId; } public override bool CanConvert(Type objectType) { return (objectType == typeof (ObjectId)); } } 

任何帮助,将不胜感激。

您正在错误地实现转换器的ReadJson方法。 existingValue参数不会为您提供从JSON读取的反序列化值,它会为您提供要替换的对象的现有值。 在大多数情况下,这将为null或为空。 您需要做的是使用reader从JSON获取值,根据需要进行转换,然后返回转换后的值。

假设您的ObjectId类有一个接受hex字符串的构造函数,以下是如何实现ReadJson方法:

 public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { JToken token = JToken.Load(reader); return new ObjectId(token.ToObject()); }