私はシンプルな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);
}
}
@CodeCaster質問を更新しました。 –
@maxim 'SimpleDto obj = JsonConvert.DeserializeObject(jsonstring);'エラーメッセージが示すように、単一のオブジェクトをコレクションにデシリアライズすることはできません(ProxyDto <>)。 –
Webruster
@Webruster 'ProxyDto'はコレクションではありません。 –
CodeCaster