2015-12-04 13 views
8

私はシンプルなDTOデシリアライズのJsonConvert経由オブジェクトとカスタムの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の実装です私はDTO用の単純なJsonを持っています:

私は、プロキシを経由して、このオブジェクトを逆シリアル化しようとすると
{"Status":3,"FromDate":12345,"ToDate":54321} 

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

それは'Newtonsoft.Json.JsonSerializationException'

現在のJSONオブジェクトをデシリアライズすることはできません(例えば例外で失敗します{'name': "value"})をタイプ 'Detect_Console_Application_Exit2.ProxyDto`1 [Detect_Console_Application_Exit2.SimpleDto]に変換する必要があります。 このエラーを修正するには、JSONをJSON文字列値に変更するか、またはデシリアライズされたタイプを通常の.NETタイプ(配列やリストなどのコレクション型ではなく整数などのプリミティブ型ではない)に変更します。 JSONオブジェクトからデシリアライズされます。 JsonObjectAttributeを型に追加して、強制的にJSONオブジェクトから逆シリアル化することもできます。 パス 'ステータス'、行1、位置10

しかし、私のJSONは、JSONをエスケープしている場合:

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

それがうまく動作します。なぜ最初のJSONオブジェクトが正しくないのか分かりません。手伝って頂けますか?ここで

更新

ToJson方法である:@dbcはそれだけで以下、JsonConverterから継承するオブジェクトを変換言ったように

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

@CodeCaster質問を更新しました。 –

+0

@maxim 'SimpleDto obj = JsonConvert.DeserializeObject (jsonstring);'エラーメッセージが示すように、単一のオブジェクトをコレクションにデシリアライズすることはできません(ProxyDto <>)。 – Webruster

+0

@Webruster 'ProxyDto 'はコレクションではありません。 – CodeCaster

答えて

0

デフォルト・シリアライザのベースとなる、彼らが使用するコードですコンバーターパラメーターTypeConverterの代わりにJsonConverterを継承する必要があります。

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); 
} 
関連する問題