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

时间:2013-09-30 15:18:46

标签: c# json mongodb serialization json.net

我正在使用官方Mongo C#驱动程序,而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));
   }
}

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:5)

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

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

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