2013-09-30 122 views
5

我使用官方的Mongo C#驅動程序,RestSharp用Json.NET調用Rest Api來執行我的序列化/反序列化。假設我有一個Person類,如下所示,這是我想發佈& GET:Json.NET反序列化Mongo ObjectId給出了錯誤的結果

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'} 

的問題是,當我執行得到的ObjectId我在客戶端上爲{0000000000000 ...} 即不是{5249} .....我想EXPE克拉。原始響應顯示正確的值,但是一旦我反序列化,就會丟失它。

的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)); 
    } 
} 

任何幫助,將不勝感激。

回答

4

您正在錯誤地執行轉換器的ReadJson方法。 existingValue參數不會爲您提供從JSON中讀取的反序列化值,它會給出您將要替換的對象的現有值。在大多數情況下,這將是空或空。你需要做的是使用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>()); 
} 
+0

AHHHH有道理!謝謝Brian,很好的回答! –