使用JavaScriptSerializer进行JSON序列化
来源:互联网 发布:凯恩帝数控编程实例 编辑:程序博客网 时间:2024/05/02 07:18
JSON是Javascript中常用的数据格式,然而,在.NET 2.0中没有内置序列化JSON的类,原因估计是当时Ajax尚未兴起。后来就有人写了一个Json.NET类库。.NET 3.5新增了一个把对象序列化为JSON字符串的类JavaScriptSerializer。这个类位于System.Web.Script.Serialization名字空间中(非Web项目需要添加System.Web.Extensions.dll引用),其使用方法也是非常简单的:
// 分类public class Category{ public int CategoryId { get; set; } // 分类编号 public string CategoryName { get; set; } // 分类名}Category testCategory = new Category() { CategoryId = 1, CategoryName = "Test" };JavaScriptSerializer serializer = new JavaScriptSerializer(); Console.Write(serializer.Serialize(testCategory)); // 调用Serialize方法进行序列化
如果不希望序列化某个属性,可以给该属性标记为ScriptIgnore:
public class Category{ [ScriptIgnore] public int CategoryId { get; set; } public string CategoryName { get; set; }}
事实上,Serialize方法是个递归方法,会递归地序列化对象的属性,因此在序列化一个复杂对象(比如DataTable)时往往会出现“循环引用”的异常,这时候就需要针对复杂类型自定义一个转换器。下面是DataTable的转换器,原理是把DataTable转换成一个字典列表后再序列化:
/// <summary>/// DataTable JSON转换类/// </summary>public class DataTableConverter : JavaScriptConverter{ public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) { DataTable dt = obj as DataTable; Dictionary<string, object> result = new Dictionary<string, object>(); List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>(); foreach (DataRow dr in dt.Rows) { Dictionary<string, object> row = new Dictionary<string, object>(); foreach (DataColumn dc in dt.Columns) { row.Add(dc.ColumnName, dr[dc.ColumnName]); } rows.Add(row); } result["Rows"] = rows; return result; } public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer) { throw new NotImplementedException(); } /// <summary> /// 获取本转换器支持的类型 /// </summary> public override IEnumerable<Type> SupportedTypes { get { return new Type[] { typeof(DataTable) }; } } }
所有自定义的转换器都要继承于JavaScriptConverter,并实现Serialize、Deserialize方法和SupportedTypes属性,其中SupportedTypes属性用于枚举此转换器支持的类型。定义了一个新的转换器后需要将其实例化并注册到JavaScriptSerializer对象:
JavaScriptSerializer JsonSerializer = new JavaScriptSerializer(); JsonSerializer.RegisterConverters( new JavaScriptConverter[] { new DataTableConverter() });
对于DateTime类型,JavaScriptSerializer默认将其序列化为 "\/Date(ticks)\/" 格式的字符串,这明显需要Javascript作进一步的解释,非常多余。笔者建议各位根据需要添加一个DateTime类型的转换器。
来自:http://heeroluo.net/ShowArticle15.aspx
- 使用JavaScriptSerializer进行JSON序列化
- 使用JavaScriptSerializer进行JSON序列化
- 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错
- JSON & JavaScriptSerializer序列化
- 如何处理“使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错”的问题
- 使用JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength属性
- 使用JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength属性
- 使用JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength属性
- JavaScriptSerializer 序列化json 时间格式-收集
- JavaScriptSerializer 序列化json 时间格式
- 使用JavaScriptSerializer序列化集合、字典、数组、DataTable为JSON字符串
- 使用JavaScriptSerializer进行序列化日期类型应该注意的问题
- ExtJs WebService Json序列化(扩展JavaScriptSerializer类)
- JavaScriptSerializer 对 DateTime 数据类型的JSON序列化的问题
- JavaScriptSerializer 对 DateTime 数据类型的JSON序列化的问题
- EntityFramework中JSON序列化循环引用----JavaScriptSerializer
- c# JavaScriptSerializer Deserialize 序列化json时 不区分大小写
- C#使用JavaScriptSerializer解析json
- /bin/bash: prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-gcc: 没有那个文件或目录
- 排序算法——堆排序
- Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the...
- JS数组方法汇总
- MyEclipse 多项目对应配置多个Tomcat
- 使用JavaScriptSerializer进行JSON序列化
- 前景检测算法——GMM
- LPC系列 ARM7 startup.s 启动代码分析(ZZ)
- 排序算法04:堆排序
- 警惕生产环境与测试环境数据不统一
- jackson中java对象中的属性名大小写问题
- QTP 浏览器最大化、最小化,适用于IE6\7\8
- Linux下线程详解
- 图文版stagefright Arch 01 -- AwesomePlayer playback flow