一、利用Web服务中的JavaScriptSerializer 类

System.Web.Script.Serialization空间,位于System.Web.extensions.dll中。

  1. JavaScriptSerializer jss = new JavaScriptSerializer();
  2. Console.WriteLine(jss.MaxJsonLength); //默认接受最大的长度是 2097152 这个是接受JSON字符串的最大长度,超长会有什么后果呢?试下
  3.  
  4. Person p = new Person(1, "关羽", 21);
  5.  
  6. //序列化
  7. string json = jss.Serialize(p);
  8. Console.WriteLine(json); //输出 {"Id":1,"Name":"关羽","Age":21}`这就是Json格式了
  9.  
  10. //反序列化:1、Deserialize泛型写法
  11. Person p2 = jss.Deserialize<Person>("{\"Id\":1,\"Name\":\"关羽\",\"Age\":21}");
  12. Console.WriteLine(p2.Id + " " + p2.Name + " " + p2.Age); //输出 1 关羽 21
  13. //反序列化:2、Deserialize的非泛型写法
  14. Person p3 = jss.Deserialize("{\"Id\":1,\"Name\":\"关羽\",\"Age\":21}", typeof(Person)) as Person; //注意这个方法返回的是object类,因此要强制转换成Person类
  15. Console.WriteLine(p3.Id + " " + p3.Name + " " + p3.Age); //同样输出 1 关羽 21
  1. //反序列化:3、将Json字符转换为Object类型
  2. object obj = jss.DeserializeObject("{\"Id\":1,\"Name\":\"关羽\",\"Age\":21}");
  3. Person p4 = jss.ConvertToType<Person>(obj);
  4. Console.WriteLine(p4.Name);
  5. Person p5 = jss.ConvertToType(obj, typeof(Person)) as Person;
  6. Console.WriteLine(p5.Name);
  7.  
  8. public class Person
  9. {
  10. public Person()
  11. { }
  12. public Person(int id, string name, int age)
  13. {
  14. this.Id = id;
  15. this.Name = name;
  16. this.Age = age;
  17. }
  18. public int Id { get; set; }
  19. public string Name { get; set; }
  20. public int Age { get; set; }
  21. }

二、利用WCF中的JSON类:DataContractJsonSerializer

System.Runtine.Serialization命名空间中,位于System.Runtine,Serialization.dll中。

  1. void Main()
  2. {
  3. DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Person));
  4. //最常用的两个方法
  1. //反序列化
  2. string str = "{\"Id\":1,\"Name\":\"刘备\",\"Age\":\"23\"}";
  3. Person p;
  4. using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(str))) //构造函数能够接受Stream参数,因此你可以用内存流,文件流等等创建
  5. {
  6. p = serializer.ReadObject(ms) as Person;
  7. }
  8. Console.WriteLine(p.Name); //输出刘备
  1. //反序列化
  1. Person p2 = new Person(2, "关羽", 23);
  2. byte[] byteArr;
  3. using (MemoryStream ms = new MemoryStream())
  4. {
  5. serializer.WriteObject(ms, p2);
  6. byteArr = ms.ToArray();
  7. }
  8. Console.WriteLine(Encoding.UTF8.GetString(byteArr)); //输出 {"Age":23,"Id":1,"Name":"关羽"}
  9. }
  10.  
  11. [DataContract] //对于使用DataContractJsonSerializer类而言,该属性是必须的
  12. public class Person
  13. {
  14. public Person(int id, string name, int age)
  15. {
  16. Id = id;
  17. Age = age;
  18. Name = name;
  19. }
  20.  
  21. [DataMember] //对于使用DataContractJsonSerializer类而言,该属性是必须的
  22. public int Id
  23. {
  24. get;
  25. set;
  26. }
  27. [DataMember]
  28. public string Name
  29. {
  30. get;
  31. set;
  32. }
  33. [DataMember]
  34. public int Age
  35. {
  36. get;
  37. set;
  38. }
  39. }

三、转换规则

  1. String,char =>string
  2. DBNull,null=>null,"null"
  3. Boolean=>trur/false
  4. int,Double,...=>Number
  5. DateTime..=>"\/Date(刻度数)\/" ,即用“\/”包含。
      eg:\/Data(13009188803)\/
  6. 枚举数=>整数值 eg:Color.Red=>3
  7. List<T> ,Arrary,ArrayLIst,=>JSON 数组
    eg:new String[]{"2","2","3"}=>["1","2","3"]
  8. Dictionary<TKey,TVlue>,HashTable =>JSON对象
    eg:new Dictionary<int, string> { { 1, "a" }, { 2, "b" }, { 3, "c" } } => {1:"a",2:"b",3:"c"}
  9. 具有公共实例属性或字段的非抽象类 =>JSON对象
    注意:公共只写属性,以及标记[ScriptIgnore]或[IgnoreDataMember]的属性、字段或属性将被忽略。
      eg: {1:"a",2:"b",3:"c"} 好包括”_type“属性。

四、利用Json.Net三方工具

https://www.newtonsoft.com/json

Json.Net(一)介绍:https://www.cnblogs.com/springsnow/p/10605359.html

五、JSON序列化过程中日期的处理

1、在c#后台进行处理:通过正则表示式

  1. System.Web.Script.Serialization.JavaScriptSerializer js = new System.Web.Script.Serialization.JavaScriptSerializer();
  2. List<Student> list = new List<Student>();
  3. list.Add(new Student()
  4. {
  5. age = 10,
  6. date = DateTime.Now,
  7. name = "宋兴柱 是个好孩\"子,这里\"有英文逗号"
  8. });
  9.  
  10. var str = js.Serialize(list);
  11. str = Regex.Replace(str, @"\\/Date\((\d+)\)\\/", match =>
  12. {
  13. DateTime dt = new DateTime(1970, 1, 1);
  14. dt = dt.AddMilliseconds(long.Parse(match.Groups[1].Value)).ToLocalTime();
  15. return dt.ToString("yyyy-MM-dd HH:mm:ss");
  16. });

原本内容:[{"age":10,"date":"\/Date(1404098342309)\/","name":"宋兴柱  是个好孩\"子,这里\"有英文逗号"}]

显示结果:[{"age":10,"date":"2014-06-30 11:22:15","name":"宋兴柱  是个好孩\"子,这里\"有英文逗号"}]

2、Json.Net中使用IsoDateTimeConverter格式自定义

  1. IsoDateTimeConverter dtConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy'年'MM'月'dd'日'" };
  2. string json = JsonConvert.SerializeObject(jack, dtConverter);

参考:Json.Net高级用法

3、在JS中进行处理:

接收json数据,日期格式为:"\/Date(1414078309687)\/"

  1. var value = "/Date(1414078309687)/";
  2.  
  3. var da = eval('new ' + value.replace('/', '', 'g'));
  4. //或者
  5. var da = value.replace(/\/Date\((\d+)\)\//gi, '$1'); ////通过正则拿到里面数。g 全局 i不区分大小写
  6.  
  7. da.toLocaleDateString() //2014/10/23
  8. da.toLocaleTimeString() //下午11:31:49

六、Json.NET 对比 NET Serializers

https://www.newtonsoft.com/json/help/html/JsonNetVsDotNetSerializers.htm

性能对比:

功能对比:

特性 Json.Net DataContractJsonSerializer JavaScriptSerializer
Json 支持 支持 支持
Bson 支持 不支持 不支持
Json Schema 支持 不支持 不支持
.Net 2.0 支持 不支持 不支持
.Net 3.5 支持 支持 支持
.Net 4.0 支持 支持 支持
Silverlight 支持 支持 不支持
Windows Phone 支持 支持 不支持
Windows 8 Metro 支持 支持 不支持
Linq to Json 支持 不支持 不支持
Indented Json(有换行格式的Json) 支持 不支持 不支持
Json和XML转换 支持 不支持 不支持
序列化DataTable和DataSet 支持 不支持 不支持
序列化Entity Framework 支持 不支持 不支持

JSON与对象的序列化与反序列化的更多相关文章

  1. Java对象的序列化与反序列化-Json篇

    说到Java对象的序列化与反序列化,我们首先想到的应该是Java的Serializable接口,这玩意在两个系统之间的DTO对象里面可能会用到,用于系统之间的数据传输.或者在RPC(远程方法调用)时可 ...

  2. 利用JavaScriptSerializer类 进行Json对象的序列化和反序列化和过滤

    项目下载:JavaScriptSerializer_对JSON对象序列化与反序列化及过滤器 利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化 1. 首 ...

  3. DynamicObject扩展--实现JSON和DynamicObject的序列化与反序列化

    度娘许久,找不到我满意的答案,于是自己东凑西凑实现一个. DynamicObject扩展--实现JSON和DynamicObject的序列化与反序列化,亲测良好. 看代码 using System; ...

  4. (记录)Jedis存放对象和读取对象--Java序列化与反序列化

    一.理论分析 在学习Redis中的Jedis这一部分的时候,要使用到Protostuff(Protobuf的Java客户端)这一序列化工具.一开始看到序列化这些字眼的时候,感觉到一头雾水.于是,参考了 ...

  5. java中对象的序列化和反序列化

    [对象的序列化和反序列化 ] 1.定义:序列化--将对象写到一个输出流中.反序列化则是从一个输入流中读取一个对象.类中的成员必须是可序列化的,而且要实现Serializable接口,这样的类的对象才能 ...

  6. Java对象的序列化与反序列化

    序列化与反序列化 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.一般将一个对象存储至一个储存媒介,例如档案或是记亿体缓冲等.在网络传输过程中,可以是字节或是 ...

  7. Java对象的序列化和反序列化[转]

    Java基础学习总结--Java对象的序列化和反序列化 一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化.把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用 ...

  8. 【Java IO流】对象的序列化和反序列化

    对象的序列化和反序列化 1)对象序列化,就是将Object对象转换成byte序列,反之叫对象的反序列化. 2)序列化流(ObjectOutputStream),是字节的过滤流—— writeObjec ...

  9. 对象的序列化与反序列化---IO学习笔记(四)

    对象的序列化,反序列化 对象的序列化: 就是将Object转换成byte序列 对象的反序列化: 将byte序列转换成Object 序列化流.反序列化流 序列化流(ObjectOutputStream) ...

随机推荐

  1. 原来你是这样的http2......

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由mariolu发表于云+社区专栏 序言 目前HTTP/2.0(简称h2)已经在广泛使用(截止2018年8月根据Alexa流行度排名的头 ...

  2. Hudson-ci/Installing Hudson Windows Service---官方文档

    < Hudson-ci Hudson Continuous Integration Server Website Download Community Mailing List • Forums ...

  3. 删除Panl控件中窗体的方法

    //删除窗体方法 private void CloseFrm() { foreach (Control item in panel1.Controls) { if (item is Form) //判 ...

  4. 信号量 P V测试详解

    信号量 当我们编写的程序使用了线程时,不管它是运行在多用户系统上,多进程系统上,还是运行在多用户多进程系统上,我们通常会发现,程序中存在着一部分临界代码,我们需要确保只有一个进程可以进入这个临界代码并 ...

  5. 引入第三方js文件,报错

    错误:Mixed Content: The page at 'https://localhost:44336/MENU' was loaded over HTTPS, but requested an ...

  6. 深入理解Java线程池:ScheduledThreadPoolExecutor

    介绍 自JDK1.5开始,JDK提供了ScheduledThreadPoolExecutor类来支持周期性任务的调度.在这之前的实现需要依靠Timer和TimerTask或者其它第三方工具来完成.但T ...

  7. poj 3104 dring 二分

    Drying Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7684   Accepted: 1967 Descriptio ...

  8. 基于easyUI实现经典系统主界面

    此文章是基于 EasyUI+Knockout实现经典表单的查看.编辑 一. 相关文件介绍 1. home.jsp:系统主界面 <!DOCTYPE html PUBLIC "-//W3C ...

  9. jQuery bind()与delegate()的区别

    笔试题: bind()与delegate()的区别主要有三点: 1 绑定目标 .bind直接绑在目标元素上 .delegate绑在父元素上 2  监听个数 .bind监听个数多——每个目标元素都需要添 ...

  10. java 简单计算器

    package com.direct.demo; import java.text.DecimalFormat; import java.util.Scanner; public class Calc ...