C#对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("{\"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(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 ,Arrary,ArrayLIst,=>JSON 数组
eg:new String[]{"2","2","3"}=>["1","2","3"] - Dictionary,HashTable =>JSON对象
eg:new Dictionary { { 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介绍://www.jb51.net/article/247911.htm
五、JSON序列化过程中日期的处理 1、在c#后台进行处理:通过正则表示式
System.Web.Script.Serialization.JavaScriptSerializer js = new System.Web.Script.Serialization.JavaScriptSerializer(); List list = new List(); 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);
参考:Json.Net高级用法
3、在JS中进行处理:
接收json数据,日期格式为:"\/Date(1414078309687)\/"
var value = "https://www.it610.com/Date(1414078309687)/"; var da = eval('new ' + value.replace('/', '', 'g')); //或者var da = value.replace(/\/Date\((\d+)\)\//gi, '$1'); ////通过正则拿到里面数。g 全局 i不区分大小写da.toLocaleDateString()//2014/10/23da.toLocaleTimeString()//下午11:31:49
六、Json.NET 对比 NET Serializers 性能对比:
文章图片
功能对比:
特性 | 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 | 支持 | 不支持 | 不支持 |
推荐阅读
- 投稿|多例核酸“假阳”背后:一家上市公司的豪赌与冒险
- Mybatis根据数据库中的表自动生成Bean对象与Mapper文件 (小白式教程)
- Mysql Lock
- Android---16进制与字节数组
- mybatis关于ORM的使用以及设计[DaoInterface 转换 Mapper代理对象]
- java(Android)跨Module调用对应类方法需求解决方案
- Android 开发 重写定位器类Timer与TimerTask
- 视觉设计师与图形设计师–谁做什么和为什么做(带信息图)
- nb|nb iot 与java_NB-IoT物联网技术解析与案例详解 PDF 下载
- Android ANR的产生与分析