DataTime をシリアル化するための RegisterConverters クラスを持つ JavaScriptSerializer があります。同じクラスに、Deserialize
をスローするメソッドがありNotImplementedException
ます。 RegisterConverters
オブジェクトをシリアライズするとき、クラスは正常に動作しています。
同じJavaScriptSerializer
オブジェクトを使用して Json オブジェクトをデシリアライズし、必要な Class オブジェクトに戻すと、 がスローされNotImplementedException
ます。
ここでは、クラスDeserilize
のメソッドを使用したくありません。RegisterConverters
どうすればそれを達成できますか?逆シリアル化するとき に何もない新しいJavaScriptSerializer
オブジェクトとして機能します。RegisterConverters
public class DefaultNullPropertiesConverter : JavaScriptConverter
{
public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
{
throw new NotImplementedException();
}
public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
{
var jsonExample = new Dictionary<string, object>();
foreach (var prop in obj.GetType().GetProperties())
{
//check if decorated with ScriptIgnore attribute
bool ignoreProp = prop.IsDefined(typeof(ScriptIgnoreAttribute), true);
var value = prop.GetValue(obj, BindingFlags.Public, null, null, null);
if (value != null && !ignoreProp)
{
if (value.GetType().FullName == "System.DateTime" && Convert.ToDateTime(value) == DateTime.MinValue)
continue;
else if (value.GetType().FullName == "System.DateTime")
jsonExample.Add(prop.Name, Convert.ToDateTime(value).ToString("yyyy-MM-dd"));
else
jsonExample.Add(prop.Name, value);
}
}
return jsonExample;
}
public override IEnumerable<Type> SupportedTypes
{
get { return GetType().Assembly.GetTypes(); }
}
}
Deserialize メソッドを呼び出すと、次のようになります。
var restGeoCodeResponse rgcr = jss.Deserialize<restGeoCodeResponse>(result);
これは DefaultNullPropertiesConverter クラスの Deserialize メソッドを呼び出すべきではありません。RegisterConverts がないため、デシリアライズするだけです。