2015-12-04 8 views
8

मैं सरल डीटीओdeserialize वस्तु और कस्टम TypeConverter

public class SimpleDto 
{ 
    public int Status { get; set; } 
    public long FromDate { get; set; } 
    public long ToDate { get; set; } 
} 

है और मैं TypeConverterAttribute साथ ProxyDto है:

public class SimpleConvert<T> : TypeConverter 
{ 
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) 
    { 
     return sourceType == typeof(string) || 
       base.CanConvertFrom(context, sourceType); 
    } 

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) 
    { 
     var strValue = value as string; 
     return strValue != null 
      ? new ProxyDto<T>{ Object = JsonConvert.DeserializeObject<T>(strValue)} 
      : base.ConvertFrom(context, culture, value); 
    } 

    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) 
    { 
     var val = value as ProxyDto<T>; 
     return destinationType == typeof(string) && val != null ? val.Object.ToJson() : base.ConvertTo(context, culture, value, destinationType); 
    } 
} 

इसके अलावा:

[TypeConverter(typeof(SimpleConvert<SimpleDto>))] 
public class ProxyDto<T> 
{ 
    public T Object { get; set; } 
} 

यहाँ SimpleConvert के कार्यान्वयन है मेरे पास डीटीओ के लिए सरल जेसन है:

{"Status":3,"FromDate":12345,"ToDate":54321} 

जब मैं प्रॉक्सी के माध्यम से इस वस्तु deserialize करने की कोशिश

var obj = JsonConvert.DeserializeObject<ProxyDto<SimpleDto>>(str); 

यह अपवाद के साथ 'Newtonsoft.Json.JsonSerializationException'

वर्तमान JSON ऑब्जेक्ट deserialize नहीं किया जा सकता है (जैसे विफल रहता है {"name": "value"}) टाइप करें 'Detect_Console_Application_Exit2.ProxyDto`1 [Detect_Console_Application_Exit2.SimpleDto]' क्योंकि टाइप को JSON स्ट्रिंग मान को सही ढंग से deserialize करने की आवश्यकता होती है। इस त्रुटि को ठीक करने के लिए या तो JSON को JSON स्ट्रिंग मान में बदलें या deserialized प्रकार को बदलें ताकि यह एक सामान्य .NET प्रकार (उदाहरण के लिए एक प्राचीन प्रकार की तरह पूर्णांक न हो, संग्रह प्रकार जैसे सरणी या सूची) हो एक JSON ऑब्जेक्ट से deserialized। JsonObjectAttribute को किसी JSON ऑब्जेक्ट से deserialize करने के लिए मजबूर करने के लिए भी जोड़ा जा सकता है। पथ 'स्थिति', लाइन 1, स्थिति 10.

लेकिन मेरे Json Json भागने गया है:

"{\"Status\":3,\"FromDate\":12345,\"ToDate\":54321}" 

यह अच्छी तरह से काम करता है। मुझे समझ में नहीं आता कि पहली JSON ऑब्जेक्ट सही क्यों नहीं है। क्या आप मेरी मदद कर सकते हैं?

अद्यतन

यहाँ ToJson विधि है:

public static class Extension 
{ 
    public static string ToJson(this object val) 
    { 
     return JsonConvert.SerializeObject(val); 
    } 
} 
+0

@CodeCaster के बजाय जेसन कनवर्टर से उत्तराधिकारी होना चाहिए ICodeCaster मैंने अपना प्रश्न अपडेट कर लिया है। –

+0

@maxim 'SimpleDto obj = JsonConvert.DeserializeObject (jsonstring); 'त्रुटि संदेश के रूप में आप एक ऑब्जेक्ट को संग्रह (ProxyDto <>) में deserialize नहीं कर सकते हैं। – Webruster

+0

@Webruster 'ProxyDto ' संग्रह नहीं है। – CodeCaster

उत्तर

0

रूप @dbc ने कहा कि यह सिर्फ वस्तुओं है कि JsonConverter से विरासत कनवर्ट करते हैं, नीचे दिए गए कोड है कि वे का उपयोग करें, डिफ़ॉल्ट serializer पर आधारित है कन्वर्टर्स पैरामीटर। आपको टाइपकॉन्टर

public static object DeserializeObject(string value, Type type, params JsonConverter[] converters) 
{ 
    JsonSerializerSettings serializerSettings; 
    if (converters == null || converters.Length <= 0) 
    serializerSettings = (JsonSerializerSettings) null; 
    else 
    serializerSettings = new JsonSerializerSettings() 
    { 
     Converters = (IList<JsonConverter>) converters 
    }; 
    JsonSerializerSettings settings = serializerSettings; 
    return JsonConvert.DeserializeObject(value, type, settings); 
} 

public static object DeserializeObject(string value, Type type, JsonSerializerSettings settings) 
{ 
    ValidationUtils.ArgumentNotNull((object) value, "value"); 
    JsonSerializer @default = JsonSerializer.CreateDefault(settings); 
    if ([email protected]()) 
    @default.CheckAdditionalContent = true; 
    using (JsonTextReader jsonTextReader = new JsonTextReader((TextReader) new StringReader(value))) 
    return @default.Deserialize((JsonReader) jsonTextReader, type); 
} 
संबंधित मुद्दे