利用.NET 3.5以后的扩展方法重写JSON序列化和反序列化,在代码可读性和可维护性上更加加强了。

首先是不使用扩展方法的写法

定义部分:

  1. /// <summary> 
  2. /// JSON序列化反序列化工具 
  3. /// </summary> 
  4. public class JSONControl 
  5. { 
  6. /// <summary> 
  7. /// JSON序列化 
  8. /// </summary> 
  9. /// <typeparam name="T"></typeparam> 
  10. /// <param name="_Object"></param> 
  11. /// <returns></returns> 
  12. public static String JsonSerializer<T>(T _Object) 
  13. { 
  14. using (MemoryStream TempMemoryStream = new MemoryStream()) 
  15. { 
  16. String MySerializationString = String.Empty; 
  17. DataContractJsonSerializer MyDataContractJsonSerializer = new DataContractJsonSerializer(typeof(T)); 
  18. MyDataContractJsonSerializer.WriteObject(TempMemoryStream, _Object); 
  19. MySerializationString = Encoding.UTF8.GetString(TempMemoryStream.ToArray()); 
  20. return MySerializationString; 
  21. } 
  22. } 
  23. /// <summary> 
  24. /// 反序列化 
  25. /// </summary> 
  26. /// <typeparam name="T"></typeparam> 
  27. /// <param name="_JsonString"></param> 
  28. /// <returns></returns> 
  29. public static T JsonDeserializer<T>(String _JsonString) 
  30. { 
  31. using (MemoryStream TempMemoryStream = new MemoryStream(Encoding.UTF8.GetBytes(_JsonString))) 
  32. { 
  33. DataContractJsonSerializer MyDataContractJsonSerializer = new DataContractJsonSerializer(typeof(T)); 
  34. return (T)MyDataContractJsonSerializer.ReadObject(TempMemoryStream); 
  35. } 
  36. } 
  37. }

使用部分:

  1. /// <summary> 
  2. /// 场景控制对象 
  3. /// </summary> 
  4. public class SceneControl 
  5. { 
  6. /// <summary> 
  7. /// 临时序列化对象 
  8. /// </summary> 
  9. [DataContract] 
  10. public class TempClass 
  11. { 
  12. /// <summary> 
  13. /// 属性1 
  14. /// </summary> 
  15. [DataMember(Name = "Property1")] 
  16. public String Property1 { get; set; } 
  17. /// <summary> 
  18. /// 属性2 
  19. /// </summary> 
  20. [DataMember(Name = "Property2")] 
  21. public String Property2 { get; set; } 
  22. } 
  23. /// <summary> 
  24. /// 测试 
  25. /// </summary> 
  26. public void Test() 
  27. { 
  28. String JsonString = "{'Property1':'111','Property2':'2'}"; 
  29. TempClass MyTempClass = JSONControl.JsonDeserializer<TempClass>(JsonString); 
  30. } 
  31. }

然后是使用扩展方法的写法

定义部分:

  1. /// <summary> 
  2. /// JSON序列化反序列化工具 
  3. /// </summary> 
  4. public static class JSONControl 
  5. { 
  6. /// <summary> 
  7. /// JSON序列化 
  8. /// </summary> 
  9. /// <typeparam name="T"></typeparam> 
  10. /// <param name="_Object"></param> 
  11. /// <returns></returns> 
  12. public static String ObjectToJson<T>(this T _Object) 
  13. { 
  14. using (MemoryStream TempMemoryStream = new MemoryStream()) 
  15. { 
  16. String MySerializationString = String.Empty; 
  17. DataContractJsonSerializer MyDataContractJsonSerializer = new DataContractJsonSerializer(typeof(T)); 
  18. MyDataContractJsonSerializer.WriteObject(TempMemoryStream, _Object); 
  19. MySerializationString = Encoding.UTF8.GetString(TempMemoryStream.ToArray()); 
  20. return MySerializationString; 
  21. } 
  22. } 
  23. /// <summary> 
  24. /// JSON反序列化 
  25. /// </summary> 
  26. /// <typeparam name="T"></typeparam> 
  27. /// <param name="_JsonString"></param> 
  28. /// <returns></returns> 
  29. public static T JsonToObject<T>(this String _JsonString) 
  30. { 
  31. using (MemoryStream TempMemoryStream = new MemoryStream(Encoding.UTF8.GetBytes(_JsonString))) 
  32. { 
  33. DataContractJsonSerializer MyDataContractJsonSerializer = new DataContractJsonSerializer(typeof(T)); 
  34. return (T)MyDataContractJsonSerializer.ReadObject(TempMemoryStream); 
  35. } 
  36. } 
  37. }

使用部分:

  1. /// <summary> 
  2. /// 场景控制对象 
  3. /// </summary> 
  4. public class SceneControl 
  5. { 
  6. /// <summary> 
  7. /// 临时序列化对象 
  8. /// </summary> 
  9. [DataContract] 
  10. public class TempClass 
  11. { 
  12. /// <summary> 
  13. /// 属性1 
  14. /// </summary> 
  15. [DataMember(Name = "Property1")] 
  16. public String Property1 { get; set; } 
  17. /// <summary> 
  18. /// 属性2 
  19. /// </summary> 
  20. [DataMember(Name = "Property2")] 
  21. public String Property2 { get; set; } 
  22. } 
  23. /// <summary> 
  24. /// 测试 
  25. /// </summary> 
  26. public void Test() 
  27. { 
  28. String JsonString = "{'Property1':'111','Property2':'2'}"; 
  29. TempClass MyTempClass = JsonString.JsonToObject<TempClass>(); 
  30. } 
  31. }

原文地址:http://zhangrou.net/post/2014/06/23/利用扩展方法重写JSON序列化和反序列化.aspx

利用扩展方法重写JSON序列化和反序列化的更多相关文章

  1. Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解

    Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全   Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...

  2. 在SpringMVC中,当Json序列化,反序列化失败的时候,会抛出HttpMessageNotReadableException异常, 当Bean validation失败的时候,会抛出MethodArgumentNotValidException异常,因此,只需要在ExceptionHandler类中添加处理对应异常的方法即可。

    在SpringMVC中,当Json序列化,反序列化失败的时候,会抛出HttpMessageNotReadableException异常, 当Bean validation失败的时候,会抛出Method ...

  3. WPF中的常用布局 栈的实现 一个关于素数的神奇性质 C# defualt关键字默认值用法 接口通俗理解 C# Json序列化和反序列化 ASP.NET CORE系列【五】webapi整理以及RESTful风格化

    WPF中的常用布局   一 写在开头1.1 写在开头微软是一家伟大的公司.评价一门技术的好坏得看具体的需求,没有哪门技术是面面俱到地好,应该抛弃对微软和微软的技术的偏见. 1.2 本文内容本文主要内容 ...

  4. 在net中json序列化与反序列化 面向对象六大原则 (第一篇) 一步一步带你了解linq to Object 10分钟浅谈泛型协变与逆变

    在net中json序列化与反序列化   准备好饮料,我们一起来玩玩JSON,什么是Json:一种数据表示形式,JSON:JavaScript Object Notation对象表示法 Json语法规则 ...

  5. Newtonsoft.Json 序列化和反序列化 时间格式

    From : http://www.cnblogs.com/litian/p/3870975.html 1.JSON序列化 string JsonStr= JsonConvert.SerializeO ...

  6. Newtonsoft.Json 序列化和反序列化 时间格式 [转]

    1.JSON序列化 string JsonStr= JsonConvert.SerializeObject(Entity); eg:   A a=new A(); a.Name="Elain ...

  7. [转]Newtonsoft.Json 序列化和反序列化 时间格式

    本文转自:http://www.cnblogs.com/litian/p/3870975.html 1.JSON序列化 string JsonStr= JsonConvert.SerializeObj ...

  8. Newtonsoft.Json 序列化和反序列化 以及时间格式

    1.JSON序列化 string JsonStr= JsonConvert.SerializeObject(Entity); eg:   A a=new A(); a.Name="Elain ...

  9. Scala中使用 Jackson API 进行JSON序列化和反序列化

    1.  什么是 Json 序列化 和 反序列化 序列化 => 将 Java对象 转换成 json字符串反序列化 => 将 json字符串 转换成 Java对象 2. 依赖包 说明 < ...

随机推荐

  1. bower报错:未能连接到github.com端口1080:超时和一些其他错误

    报错1:fatal: unable to access 'https://github.com/xxx/xxxx.git/': Failed to connect to github.com port ...

  2. ASP.net MVC4/MVC5 错误处理及设置

    很无聊的记录下.首先IIS 7以上的版本测试才成功 首先 //全局ErrorHandler public static void RegisterGlobalFilters(GlobalFilterC ...

  3. js中的基本类型与引用类型学习

    一.基本数据类型 ECMAScript 有 5 种原始类型(primitive type),即 Undefined.Null.Boolean.Number 和 String,也称为基本数据类型,ES6 ...

  4. Notification通知栏的使用

    一.基础的知识了解 1.pendingIntent : 它是Intent的封装,可以跳转某个Activity.给Service发送一个命令.还可以发送一个广播 2.进度条的使用方法 3.更新通知栏的信 ...

  5. 比特、字节、K

    比特(bit) 比特,计算机专业术语,是信息量单位,由英文BIT音译而来.BIT为Binary digit(二进制数)位的缩写.二进制数的一位所包含的信息就是一比特,如二进制数0100就是4比特. 字 ...

  6. 使用VS Code开发.Net Core 2.0 MVC Web应用程序教程之三(配置文件读取)

    干了一天的活,还有点时间,给兄弟们写点东西吧. 大家有没有发现一个问题?那就是在.Net Core的MVC项目里面,没有.config文件了!!!同志们,没有config文件了啊,这样搞,我以后要做些 ...

  7. linux 服务器性能监控(一)

    这篇文章主要介绍一些常用的linux服务器性能监控命令,包括命令的常用参数.指标的含义以及一些交互操作. 几个问题 命令本身并不复杂,关键是你对操作系统基础知识的掌握和理解,先来看看下面几个问题: C ...

  8. Swift 里字符串(九)UTF16View

    即以 UTF16 编码的格式来查看字符串. UTF16View 是一个结构体 @_fixed_layout public struct UTF16View { @usableFromInline in ...

  9. nacicat premium 快捷键

    1.ctrl+q          打开查询窗口 2.ctrl+/           注释sql语句 3.ctrl+shift +/  解除注释 4.ctrl+r          运行查询窗口的s ...

  10. 通过sessionStorage来根据屏幕宽度变化来加载不同的html页面

    因为项目需要,分别写了移动端和PC端的两个html页面,现在需要根据不同的屏幕宽度来加载对应的页面. 先说一下本人的思路-- 刚开始我直接在加载页面的时候判断屏幕宽度,然后加载相应的页面,大家是不是也 ...