JSON的序列化和反序列化已经成为Web开发必不可少的知识。现在常用的有System.Web.Script.Serialization下的JavaScriptSerializer来进行处理;另外一个比较常用且高效的类库是JSON.NET。

在开发一些小的应用时,由于想尽量较少项目的依赖,所以不太愿意使用JSON.NET。JavaScriptSerializer基本上能满足简单的需求,但当一个属性要序列化成别的名字时,就显得力不从心了。还有就是可能业务需要,某些属性不希望在某一个条件下进行序列化。鉴于上面的业务需要,我们就需要自定义一个JavaScriptConverter。

自定义JavaScriptConverter的使用流程:

  • 定义一个JavaScriptConverter,指明期支持的类型。
  • 在序列化方法调用前注册该转换器。

显然,这两个步骤都不是很麻烦。我们举一个具体的业务环境来说明:在ExtJS的TreePanel控件中,TreeNode的属性有id、text等,其中如果checked属性存在,则属性结果显示节点选择框。在C#中,checked是关键字,所以不能定义为属性,TreeNode的C#代码如下:

    public class TreeNode{public string id { get; set; }public string text { get; set; }public bool? isChecked { get; set; }public List<TreeNode> children { get; set; }}

我将checked属性映射到类中的isChecked字段,该字段可以有三个状态:null、true和false,当为null的时候,将不会序列化该字段,前台也不会显示节点选择框。

现在要实现一个TreeNodeJSConverter,代码如下:

    public class TreeNodeJSConverter : JavaScriptConverter{public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer){TreeNode node = new TreeNode();object value = null;if (dictionary.TryGetValue("id", out value))node.id = (string)value;if (dictionary.TryGetValue("text", out value))node.text = (string)value;if (dictionary.TryGetValue("children", out value)){if (value != null && value.GetType() == typeof(ArrayList)){var list = (ArrayList)value;node.children = new List<TreeNode>();foreach (Dictionary<string, object> item in list){node.children.Add((TreeNode)this.Deserialize(item, type, serializer));}}else{node.children = null;}}return node;}public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer){Dictionary<string, object> dic = new Dictionary<string, object>();var node = obj as TreeNode;if (node == null)return null;if(!string.IsNullOrEmpty(node.id))dic.Add("id", node.id);if (!string.IsNullOrEmpty(node.text))dic.Add("text", node.text);if (node.isChecked.HasValue)dic.Add("checked", node.isChecked.Value);if (node.children != null)dic.Add("children", node.children);return dic;}public override IEnumerable<Type> SupportedTypes{get{return new Type[] { typeof(TreeNode) };}}}

代码讨论:TreeNodeJSConverter类首先需要继承JavaScriptConverter,然后实现它的相关方法:Deserialize、Serialize和SupportedTypes,分别是反序列化、序列化和支持的类型。

在序列化方法Serialize中,我们需要将属性添加到一个字典结构中,就可以完成序列化的工作了。具体要序列化那些字段还是要判断一下相应的值是否存在。

在反序列化方法Deserialize中,字典结构存放着相应的值,当值存在的时候就可以为TreeNode相应的字段赋值。比较麻烦的事children属性,因为其为嵌套的List类型,而JSON中的数组结构会被转化成ArrayList结构,所以我们只需要递归的循环ArrayList中的每一个项,将其转换为TreeNode就可以了。

最后是SupportedTypes字段,返回支持的类型,我们这里显示的返回TreeNode的类型。

定义好了转换器之后,我们需要为在序列化的时候注册该转换器即可:

        public static string SerializeToJson(object obj){JavaScriptSerializer serializer = new JavaScriptSerializer();serializer.RegisterConverters(new JavaScriptConverter[] { new TreeNodeJSConverter() });return serializer.Serialize(obj);}public static T DeserializeJson<T>(string jsonString){JavaScriptSerializer serializer = new JavaScriptSerializer();serializer.RegisterConverters(new JavaScriptConverter[] { new TreeNodeJSConverter() });return serializer.Deserialize<T>(jsonString);}本文转自齐师傅博客园博客,原文链接:http://www.cnblogs.com/youring2/archive/2013/01/10/Custom_JavaScriptConverter.html,如需转载请自行联系原作者

JavaScriptSerializer序列化和反序列化JSON:使用自定义JavaScriptConverter相关推荐

  1. .Net 中关于序列化和反序列化Json的方法

    .Net SDK中关于序列化和反序列化Json的方法 项目中遇到和服务端交互时需要传递数据包为json格式的包,所以在服务端和SDK中都需要对json进行解析和组合的操作, 并且对一些复杂结构的jso ...

  2. C# 序列化与反序列化json

    与合作伙伴讨论问题,说到的c++与c#数据的转换调用,正好就说到了序列化与反序列化,同样也可用于不同语言间的调用,做了基础示例,作以下整理: 1 using System.Data; 2 using ...

  3. JavaScriptSerializer序列化与反序列化--备忘

    msdn:JavaScriptSerializer 类 序列化: JavaScriptSerializer json = new JavaScriptSerializer(); sproduct.Te ...

  4. python(json):序列化 、反序列化 --- json.dump() / json.dumps() / json.load() / json.loads()的使用

    序列化 通过将对象序列化可以将其存储在变量或者文件中,可以保存当时对象的状态,实现其生命周期的延长.并且需要时可以再次将这个对象读取出来.json序列化提供了了2个方法,json.dumps()和js ...

  5. 自定义一个类型实现go时间类型的json和bson的序列化和反序列化

    自定义一个类型实现go时间类型的json和bson的序列化和反序列化 需求 实现 -自定义JSONTime类型 如何使用? 需求 go语言在时间 和 json 转换时使用 yyyy-MM-dd HH: ...

  6. Json的序列化和反序列化的几种方式

    [什么是Json] 序列化:将对象转换成字节流的过程,这样就可以轻松将对象保存在磁盘文件或数据库中. 反序列化:序列化的逆过程,就是将字节流转换回原来的对象的过程. 当前主流的序列化JSON字符串主要 ...

  7. 在C#中,Json的序列化和反序列化的几种方式总结

    在C#中,Json的序列化和反序列化的几种方式总结 在这篇文章中,我们将会学到如何使用C#,来序列化对象成为Json格式的数据,以及如何反序列化Json数据到对象. 什么是JSON? JSON (Ja ...

  8. C#-JSON的序列化和反序列化

    个人博客:http://www.chenjianqu.com/ 原文链接:http://www.chenjianqu.com/show-13.html 目录: 1.       前言 2.       ...

  9. JavaScript JSON序列化和反序列化

    文章目录 JavaScript JSON序列化和反序列化 概述 JSON序列化 JSON.stringify() 仅一个参数使用 使用2个参数 使用3个参数 其他 自定义toJson 序列化顺序 反序 ...

最新文章

  1. 2021年网购大数据:哪些品类坑最多?什么价位的商品最有保障?
  2. 正则表达式(读书过程所记未整理)
  3. Gtk:利用alignment控制button大小
  4. Oracle中关于处理小数点位数的几个函数,取小数位数,Oracle查询函数
  5. 电脑网线主要分类(网络传输介质)
  6. php会员代码大全,PHP在线获取VIP会员账号API接口代码
  7. windows - 更改用户账户名称(windows10)
  8. 国产CPU 申威1621 异数OS基础组件理论性能测试报告
  9. 2012年8月22日
  10. soundbar未来发展_Soundbar专题:一条走天下,属于客厅影院的未来
  11. 百度搜索正式升级冰桶算法5.0!
  12. /专访/对话堵俊平:最好的开源生态模型,是亚马逊的原始森林
  13. 研究生必备的文献翻译软件知云文献翻译替代品--Mac monterey
  14. 大学生学科竞赛管理网站系统、学科竞赛管理系统
  15. 告别手动输入验证码!Web自动化测试带你解锁验证码处理和Cookie机制,跨越测试瓶颈!
  16. 从Q4财报看百度破局BAT,借智能云“化茧成蝶”仰望星辰大海
  17. 计算机机房的监控,机房动环监控解决方案
  18. 【内存】物理内存和虚拟内存
  19. (四)分布式系统-Communication
  20. 二叉树输入与存储的问题

热门文章

  1. c语言把一个数组赋值给另一个数组_如何把一个固定数组的值传递给另外一个数组...
  2. python name is not defined_PythonNameError: global name 'NAME' is not not defined这个问题怎么解决?...
  3. js页面跳转常用的几种方式
  4. 富士康c语言试卷答案,2015富士康笔试题目及答案
  5. 使用睡袋_在户外一个关乎睡眠的重要因素——睡袋
  6. otsu阈值分割算法_图像分割之大津算法(OTSU)
  7. linux Fedora安装桌面,CentOS6.x\Red Hat\Fedora\Linux 安装Wine 1.7.48 桌面运行环境教程
  8. php 中文 处理,PHP处理中文字符串截取
  9. 英飞凌AI电磁越野组浅析
  10. 东南大学 | 12年,热爱始终如一