JSON与对象的序列化与反序列化
一、利用Web服务中的JavaScriptSerializer 类
System.Web.Script.Serialization空间,位于System.Web.extensions.dll中。
- JavaScriptSerializer jss = new JavaScriptSerializer();
- Console.WriteLine(jss.MaxJsonLength); //默认接受最大的长度是 2097152 这个是接受JSON字符串的最大长度,超长会有什么后果呢?试下
- Person p = new Person(1, "关羽", 21);
- //序列化
- string json = jss.Serialize(p);
- Console.WriteLine(json); //输出 {"Id":1,"Name":"关羽","Age":21}`这就是Json格式了
- //反序列化:1、Deserialize泛型写法
- Person p2 = jss.Deserialize<Person>("{\"Id\":1,\"Name\":\"关羽\",\"Age\":21}");
- Console.WriteLine(p2.Id + " " + p2.Name + " " + p2.Age); //输出 1 关羽 21
- //反序列化:2、Deserialize的非泛型写法
- Person p3 = jss.Deserialize("{\"Id\":1,\"Name\":\"关羽\",\"Age\":21}", typeof(Person)) as Person; //注意这个方法返回的是object类,因此要强制转换成Person类
- Console.WriteLine(p3.Id + " " + p3.Name + " " + p3.Age); //同样输出 1 关羽 21
- //反序列化:3、将Json字符转换为Object类型
- object obj = jss.DeserializeObject("{\"Id\":1,\"Name\":\"关羽\",\"Age\":21}");
- Person p4 = jss.ConvertToType<Person>(obj);
- Console.WriteLine(p4.Name);
- Person p5 = jss.ConvertToType(obj, typeof(Person)) as Person;
- Console.WriteLine(p5.Name);
- public class Person
- {
- public Person()
- { }
- public Person(int id, string name, int age)
- {
- this.Id = id;
- this.Name = name;
- this.Age = age;
- }
- public int Id { get; set; }
- public string Name { get; set; }
- public int Age { get; set; }
- }
二、利用WCF中的JSON类:DataContractJsonSerializer
System.Runtine.Serialization命名空间中,位于System.Runtine,Serialization.dll中。
- void Main()
- {
- DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Person));
- //最常用的两个方法
- //反序列化
- string str = "{\"Id\":1,\"Name\":\"刘备\",\"Age\":\"23\"}";
- Person p;
- using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(str))) //构造函数能够接受Stream参数,因此你可以用内存流,文件流等等创建
- {
- p = serializer.ReadObject(ms) as Person;
- }
- Console.WriteLine(p.Name); //输出刘备
- //反序列化
- Person p2 = new Person(2, "关羽", 23);
- byte[] byteArr;
- using (MemoryStream ms = new MemoryStream())
- {
- serializer.WriteObject(ms, p2);
- byteArr = ms.ToArray();
- }
- Console.WriteLine(Encoding.UTF8.GetString(byteArr)); //输出 {"Age":23,"Id":1,"Name":"关羽"}
- }
- [DataContract] //对于使用DataContractJsonSerializer类而言,该属性是必须的
- public class Person
- {
- public Person(int id, string name, int age)
- {
- Id = id;
- Age = age;
- Name = name;
- }
- [DataMember] //对于使用DataContractJsonSerializer类而言,该属性是必须的
- public int Id
- {
- get;
- set;
- }
- [DataMember]
- public string Name
- {
- get;
- set;
- }
- [DataMember]
- public int Age
- {
- get;
- set;
- }
- }
三、转换规则
- String,char =>string
- DBNull,null=>null,"null"
- Boolean=>trur/false
- int,Double,...=>Number
- DateTime..=>"\/Date(刻度数)\/" ,即用“\/”包含。
eg:\/Data(13009188803)\/ - 枚举数=>整数值 eg:Color.Red=>3
- List<T> ,Arrary,ArrayLIst,=>JSON 数组
eg:new String[]{"2","2","3"}=>["1","2","3"] - Dictionary<TKey,TVlue>,HashTable =>JSON对象
eg:new Dictionary<int, string> { { 1, "a" }, { 2, "b" }, { 3, "c" } } => {1:"a",2:"b",3:"c"} - 具有公共实例属性或字段的非抽象类 =>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#后台进行处理:通过正则表示式
- System.Web.Script.Serialization.JavaScriptSerializer js = new System.Web.Script.Serialization.JavaScriptSerializer();
- List<Student> list = new List<Student>();
- list.Add(new Student()
- {
- age = 10,
- date = DateTime.Now,
- name = "宋兴柱 是个好孩\"子,这里\"有英文逗号"
- });
- var str = js.Serialize(list);
- str = Regex.Replace(str, @"\\/Date\((\d+)\)\\/", match =>
- {
- DateTime dt = new DateTime(1970, 1, 1);
- dt = dt.AddMilliseconds(long.Parse(match.Groups[1].Value)).ToLocalTime();
- return dt.ToString("yyyy-MM-dd HH:mm:ss");
- });
原本内容:[{"age":10,"date":"\/Date(1404098342309)\/","name":"宋兴柱 是个好孩\"子,这里\"有英文逗号"}]
显示结果:[{"age":10,"date":"2014-06-30 11:22:15","name":"宋兴柱 是个好孩\"子,这里\"有英文逗号"}]
2、Json.Net中使用IsoDateTimeConverter格式自定义
- IsoDateTimeConverter dtConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy'年'MM'月'dd'日'" };
- string json = JsonConvert.SerializeObject(jack, dtConverter);
3、在JS中进行处理:
接收json数据,日期格式为:"\/Date(1414078309687)\/"
- var value = "/Date(1414078309687)/";
- var da = eval('new ' + value.replace('/', '', 'g'));
- //或者
- var da = value.replace(/\/Date\((\d+)\)\//gi, '$1'); ////通过正则拿到里面数。g 全局 i不区分大小写
- da.toLocaleDateString() //2014/10/23
- 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与对象的序列化与反序列化的更多相关文章
- Java对象的序列化与反序列化-Json篇
说到Java对象的序列化与反序列化,我们首先想到的应该是Java的Serializable接口,这玩意在两个系统之间的DTO对象里面可能会用到,用于系统之间的数据传输.或者在RPC(远程方法调用)时可 ...
- 利用JavaScriptSerializer类 进行Json对象的序列化和反序列化和过滤
项目下载:JavaScriptSerializer_对JSON对象序列化与反序列化及过滤器 利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化 1. 首 ...
- DynamicObject扩展--实现JSON和DynamicObject的序列化与反序列化
度娘许久,找不到我满意的答案,于是自己东凑西凑实现一个. DynamicObject扩展--实现JSON和DynamicObject的序列化与反序列化,亲测良好. 看代码 using System; ...
- (记录)Jedis存放对象和读取对象--Java序列化与反序列化
一.理论分析 在学习Redis中的Jedis这一部分的时候,要使用到Protostuff(Protobuf的Java客户端)这一序列化工具.一开始看到序列化这些字眼的时候,感觉到一头雾水.于是,参考了 ...
- java中对象的序列化和反序列化
[对象的序列化和反序列化 ] 1.定义:序列化--将对象写到一个输出流中.反序列化则是从一个输入流中读取一个对象.类中的成员必须是可序列化的,而且要实现Serializable接口,这样的类的对象才能 ...
- Java对象的序列化与反序列化
序列化与反序列化 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.一般将一个对象存储至一个储存媒介,例如档案或是记亿体缓冲等.在网络传输过程中,可以是字节或是 ...
- Java对象的序列化和反序列化[转]
Java基础学习总结--Java对象的序列化和反序列化 一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化.把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用 ...
- 【Java IO流】对象的序列化和反序列化
对象的序列化和反序列化 1)对象序列化,就是将Object对象转换成byte序列,反之叫对象的反序列化. 2)序列化流(ObjectOutputStream),是字节的过滤流—— writeObjec ...
- 对象的序列化与反序列化---IO学习笔记(四)
对象的序列化,反序列化 对象的序列化: 就是将Object转换成byte序列 对象的反序列化: 将byte序列转换成Object 序列化流.反序列化流 序列化流(ObjectOutputStream) ...
随机推荐
- 原来你是这样的http2......
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由mariolu发表于云+社区专栏 序言 目前HTTP/2.0(简称h2)已经在广泛使用(截止2018年8月根据Alexa流行度排名的头 ...
- Hudson-ci/Installing Hudson Windows Service---官方文档
< Hudson-ci Hudson Continuous Integration Server Website Download Community Mailing List • Forums ...
- 删除Panl控件中窗体的方法
//删除窗体方法 private void CloseFrm() { foreach (Control item in panel1.Controls) { if (item is Form) //判 ...
- 信号量 P V测试详解
信号量 当我们编写的程序使用了线程时,不管它是运行在多用户系统上,多进程系统上,还是运行在多用户多进程系统上,我们通常会发现,程序中存在着一部分临界代码,我们需要确保只有一个进程可以进入这个临界代码并 ...
- 引入第三方js文件,报错
错误:Mixed Content: The page at 'https://localhost:44336/MENU' was loaded over HTTPS, but requested an ...
- 深入理解Java线程池:ScheduledThreadPoolExecutor
介绍 自JDK1.5开始,JDK提供了ScheduledThreadPoolExecutor类来支持周期性任务的调度.在这之前的实现需要依靠Timer和TimerTask或者其它第三方工具来完成.但T ...
- poj 3104 dring 二分
Drying Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7684 Accepted: 1967 Descriptio ...
- 基于easyUI实现经典系统主界面
此文章是基于 EasyUI+Knockout实现经典表单的查看.编辑 一. 相关文件介绍 1. home.jsp:系统主界面 <!DOCTYPE html PUBLIC "-//W3C ...
- jQuery bind()与delegate()的区别
笔试题: bind()与delegate()的区别主要有三点: 1 绑定目标 .bind直接绑在目标元素上 .delegate绑在父元素上 2 监听个数 .bind监听个数多——每个目标元素都需要添 ...
- java 简单计算器
package com.direct.demo; import java.text.DecimalFormat; import java.util.Scanner; public class Calc ...