2013-09-30 9 views
5

मैं आधिकारिक मोंगो सी # चालक और रेस्टशर्प का उपयोग कर रहा हूं ताकि मेरे सीरियलाइजेशन/deserialization करने के लिए Json.NET के साथ एक रेस्ट एपी को कॉल किया जा सके।Json.NET Deserializing Mongo ObjectId गलत परिणाम दे रहा है

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

मैं एक नया व्यक्ति वस्तु बनाने:

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

पोस्ट यह, और सर्वर पर मैं देख रहा हूँ मैं एक व्यक्ति वर्ग, के रूप में इस प्रकार है जो मैं & प्राप्त पोस्ट करना चाहते हैं कहो जिसके बाद सही है:

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

समस्या यह है, जब मैं प्रदर्शन एक GET ObjectId मैं ग्राहक पर मिलता है {0000000000000 ...} यानी नहीं {5249 .....} मैं था अनुभव सीटी। कच्चे प्रतिक्रिया सही मान दिखाया जा रहा है, लेकिन मैं इसे ढीला एक बार मैं deserialize।

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 से पढ़ा deserialized मूल्य नहीं देता है, तो यह आपको उद्देश्य यह है कि आप का स्थान ले लेगी की मौजूदा मूल्य देता है। ज्यादातर मामलों में यह शून्य या खाली हो जाएगा। आपको क्या करने की जरूरत है 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 समझ में आता है !!! धन्यवाद ब्रायन, अच्छा जवाब! –

संबंधित मुद्दे