JavaScriptSerializer序列化和反序列化JSON:使用自定义JavaScriptConverter JSON的序列化和反序列化已经成为Web开发必不可少的知识。现在常用的有Syste
来源:互联网 发布:雅马哈合成器 知乎 编辑:程序博客网 时间:2024/06/06 03:18
JavaScriptSerializer序列化和反序列化JSON:使用自定义JavaScriptConverter
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); }
- JavaScriptSerializer序列化和反序列化JSON:使用自定义JavaScriptConverter JSON的序列化和反序列化已经成为Web开发必不可少的知识。现在常用的有Syste
- JSON和plist的序列化和反序列化
- JSON的序列化和反序列化
- c#中的Json的序列化和反序列化
- .NET进行Json的序列化和反序列化
- C#对JSON的序列化和反序列化
- C#中的Json的序列化和反序列化
- js中json的序列化和反序列化
- JSON的序列化和反序列化
- Json的序列化和反序列化(一)
- 关于Json的序列化和反序列化
- Json的序列化和反序列化(一)
- C#操作Json的序列化和反序列化
- DataContractJsonSerializer进行Json的序列化和反序列化
- swift json的序列化和反序列化
- CSharp进行JSON的序列化和反序列化
- Newtonsoft.Json的序列化和反序列化
- python 学习 -- json的序列化和反序列化
- 汇哲科技- 8月31日国盟CISA每日一题
- 记一次页面失效,你正在尝试访问一个无效页面的错误
- 加载数据到ListView
- 微信网页授权登陆如何实现回调多个域名?
- 汇哲科技- 8月31日国盟CISSP每日一题
- JavaScriptSerializer序列化和反序列化JSON:使用自定义JavaScriptConverter JSON的序列化和反序列化已经成为Web开发必不可少的知识。现在常用的有Syste
- map和reduce数量控制
- 第五十八篇:commons-collections使用介绍之List
- 汇哲科技-8月31日国盟CISM每日一题
- Unix信号详解(Signal的信号说明)
- Oracle跟MySQL的区别和联系
- SSM+Ehcache整合实例
- POI 附件在线预览
- tensorflow的基本运作