使用JavaScriptSerializer进行JSON序列化时自定义JavaScriptConverter的问题
有史以来第一次发这么长的题目,先汗一个~~~
要序列化的类如下
在使用JavaScriptSerializer序列化后得到这么个字符串
{"Name":"张三","Birthday":"\/Date(1340693123252)\/"}
因为想要用yyyyMMdd的方式进行序列化输出,因此想到了自定义JavaScriptConverter
序列化后得到这样的结果
{"Name":"张三","BirthDay":{"Value":"2012-06-26 17:11:13"}}
可是反序列化的时候,问题出来了
JavaScriptSerializer jss = new JavaScriptSerializer();
jss.RegisterConverters(new JavaScriptConverter[] { new DateTimeConverter() });
TestAAA obj = jss.Deserialize<TestAAA>(TextBox1.Text);
在
TestAAA obj = jss.Deserialize<TestAAA>(TextBox1.Text);
这一句报了“未将对象引用设置到对象的实例”的错误
把反序列化代码改成这样,并加上断点
JavaScriptSerializer jss = new JavaScriptSerializer();
jss.RegisterConverters(new JavaScriptConverter[] { new DateTimeConverter() });
object obj = jss.DeserializeObject(TextBox1.Text);
TestAAA a = jss.ConvertToType<TestAAA>(obj);
第3行能正常执行,得到的obj是一个IDictionary<string,object>集合
第4行报“未将对象引用设置到对象的实例”的错误
错误的内部堆栈如下:
System.Web.Script.Serialization.ObjectConverter.ConvertDictionaryToObject(IDictionary`2 dictionary, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) +1059
System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) +71
System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) +147
System.Web.Script.Serialization.ObjectConverter.AssignToPropertyOrField(Object propertyValue, Object o, String memberName, JavaScriptSerializer serializer, Boolean throwOnError) +202
System.Web.Script.Serialization.ObjectConverter.ConvertDictionaryToObject(IDictionary`2 dictionary, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) +1177
System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) +71
System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) +147
System.Web.Script.Serialization.ObjectConverter.ConvertObjectToType(Object o, Type type, JavaScriptSerializer serializer) +21
System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit) +48
System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(String input) +70
reflector反进去看了一下,没看出道道来,为啥这个反序列化不行???
要序列化的类如下
public class TestAAA
{
public string Name
{
get;
set;
}
public DateTime? BirthDay
{
get;
set;
}
}
TestAAA obj = new TestAAA
{
Name = "张三",
BirthDay = DateTime.Now
};
JavaScriptSerializer jss = new JavaScriptSerializer();
TextBox1.Text= jss.Serialize(obj);
在使用JavaScriptSerializer序列化后得到这么个字符串
{"Name":"张三","Birthday":"\/Date(1340693123252)\/"}
因为想要用yyyyMMdd的方式进行序列化输出,因此想到了自定义JavaScriptConverter
public class DateTimeConverter : JavaScriptConverter
{
public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
{
if (string.IsNullOrEmpty(dictionary["Value"].ToString()))
return null;
return DateTime.Parse(dictionary["Value"].ToString());
}
public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
{
IDictionary<string, object> result = new Dictionary<string, object>();
if (obj == null)
result["Value"] = string.Empty;
else
result["Value"] = ((DateTime)obj).ToString("yyyy-MM-dd HH:mm:ss");
return result;
}
public override IEnumerable<Type> SupportedTypes
{
get { yield return typeof(DateTime); }
}
}
JavaScriptSerializer jss = new JavaScriptSerializer();
jss.RegisterConverters(new JavaScriptConverter[] { new DateTimeConverter() });
TextBox1.Text= jss.Serialize(obj);
序列化后得到这样的结果
{"Name":"张三","BirthDay":{"Value":"2012-06-26 17:11:13"}}
可是反序列化的时候,问题出来了
JavaScriptSerializer jss = new JavaScriptSerializer();
jss.RegisterConverters(new JavaScriptConverter[] { new DateTimeConverter() });
TestAAA obj = jss.Deserialize<TestAAA>(TextBox1.Text);
在
TestAAA obj = jss.Deserialize<TestAAA>(TextBox1.Text);
这一句报了“未将对象引用设置到对象的实例”的错误
把反序列化代码改成这样,并加上断点
JavaScriptSerializer jss = new JavaScriptSerializer();
jss.RegisterConverters(new JavaScriptConverter[] { new DateTimeConverter() });
object obj = jss.DeserializeObject(TextBox1.Text);
TestAAA a = jss.ConvertToType<TestAAA>(obj);
第3行能正常执行,得到的obj是一个IDictionary<string,object>集合
第4行报“未将对象引用设置到对象的实例”的错误
错误的内部堆栈如下:
System.Web.Script.Serialization.ObjectConverter.ConvertDictionaryToObject(IDictionary`2 dictionary, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) +1059
System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) +71
System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) +147
System.Web.Script.Serialization.ObjectConverter.AssignToPropertyOrField(Object propertyValue, Object o, String memberName, JavaScriptSerializer serializer, Boolean throwOnError) +202
System.Web.Script.Serialization.ObjectConverter.ConvertDictionaryToObject(IDictionary`2 dictionary, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) +1177
System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) +71
System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) +147
System.Web.Script.Serialization.ObjectConverter.ConvertObjectToType(Object o, Type type, JavaScriptSerializer serializer) +21
System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit) +48
System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(String input) +70
reflector反进去看了一下,没看出道道来,为啥这个反序列化不行???
...全文
相关推荐
解决Asp.net Mvc返回JsonResult中DateTime类型数据格式问题的方法.pdf
在ASP.NET MVC框架中,当你需要向客户端返回JSON格式的数据时,通常会使用`JsonResult`。
C# JsonHelper 操作辅助类,拿来直接用
该方法内部使用了JavaScriptSerializer,并注册了自定义的JavaScriptConverter来处理动态类型的反序列化。4.
解决json日期格式问题的3种方法
以下是在服务器端解决JSON日期格式问题的3种方法:方法1:服务器端序列化时指定日期格式在服务器端序列化日期数据为JSON字符串之前,可以使用各种编程语言内置的日期格式化工具将DateTime类型的数据转换为易于阅读的字符串格式
【ASP.NET编程知识】Json返回时间的格式中出现乱码问题的两种解决方案.docx
一、问题描述在ASP.NET编程中,使用Json返回时间时,如果时间格式不正确,可能会导致乱码问题。
解决Asp.net Mvc返回JsonResult中DateTime类型数据格式问题的方法.docx
在内部,它使用JavaScriptSerializer或Json.NET(如果已配置)将对象序列化为JSON字符串。


