[.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化
[.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化
本节导读:
介绍JSON的结构,在JS中的使用。重点说明JSON如何在.NET中快带序列化和反序列化。最后介绍在使用.NET序列化JSON过程中的注意事项。
读前必备:
B.LINQ使用 [.net 面向对象编程基础] (20) LINQ使用
1. 关于JSON
JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式。
2. 为什么要使用JSON
我们上节说的XML虽然也是一种通用的跨平台数据交换格式,为什么不用呢?
A.在Javascript中序列化和反序列化XML相当不方便。而Js中JSON可以非常方便的反序列化为对象。
B.在移动应用中,XML拥有过多的标记,比较占用流量,而JSON几乎没有任何标记。
3. JSON两种格式
JSON有两种格式:对象和数组(集合)
我们先看一下这两种格式:
对象:
{
"kongfuName": "独孤九剑",
"lethality": 100
}
数组(集合):
[
{
"kongfuName": "独孤九剑",
"lethality": 100
},
{
"kongfuName": "易筋经",
"lethality": 100
}
]
4. JSON字符串
JSON字符串,就是将符合以上两种格式的字符串
如:var jsonStr=”[{'kongfuName':'独孤九剑','lethality':100},{'kongfuName':'易筋经','lethality':100}]”;
5. Javasctip中反序列化JSON
JQuery中提供的反序列化方法:
var obj = jQuery.parseJSON('{"name":"John"}');alert( obj.name === "John" );
6. .NET自带的两种JSON序列化
下面分别举例说明,还是采用我们之前的“武林大侠”“武功”实体类为例,先定义两个类,如下:
两个类定义:
/// <summary>
/// 类:武林高手
/// MartialArtsMaster
/// </summary>
[DataContract]
public class MartialArtsMaster
{
[DataMember]
/// <summary>
/// 编号
/// </summary>
public int id { get; set; }
[DataMember]
/// <summary>
/// 姓名
/// </summary>
public string name { get; set; }
[DataMember]
/// <summary>
/// 年龄
/// </summary>
public int age { get; set; }
[DataMember]
/// <summary>
/// 门派
/// </summary>
public string menpai { get; set; }
[DataMember]
/// <summary>
/// 武学
/// </summary>
public List<Kongfu> kongFu { get; set; } /// <summary>
/// 级别
/// </summary>
public int level { get; set; }
} /// <summary>
/// 类:武学
/// Kongfu
/// </summary>
[DataContract]
public class Kongfu
{
[DataMember]
/// <summary>
/// 武学名称
/// </summary>
public string kongfuName { get; set; } [DataMember]
/// <summary>
/// 杀伤力
/// </summary>
public int lethality { get; set; }
}
增加几个武林高手:
List<MartialArtsMaster> masterList = new List<MartialArtsMaster>();
//增加几个武林高手
masterList.Add(new MartialArtsMaster()
{
id = ,
name = "令狐冲",
age = ,
menpai = "华山",
kongFu = new List<Kongfu>() { new Kongfu() { kongfuName = "独孤九剑", lethality = }, new Kongfu() { kongfuName = "易筋经", lethality = } },
level =
}); masterList.Add(new MartialArtsMaster()
{
id = ,
name = "黄药师",
age = ,
menpai = "桃花岛",
kongFu = new List<Kongfu>() { new Kongfu() { kongfuName = "弹指神通", lethality = } },
level =
}); masterList.Add(new MartialArtsMaster()
{
id = ,
name = "段誉",
age = ,
menpai = "天龙寺",
kongFu = new List<Kongfu>() { new Kongfu() { kongfuName = "凌波微步", lethality = }, new Kongfu() { kongfuName = "六脉神剑", lethality = } },
level =
}); masterList.Add(new MartialArtsMaster()
{
id = ,
name = "乔峰",
age = ,
menpai = "丐帮",
kongFu = new List<Kongfu>() { new Kongfu() { kongfuName = "降龙十八掌", lethality = }, new Kongfu() { kongfuName = "打狗棒法", lethality = } },
level =
});
6.1 DataContractJsonSerializer
程序集:System.Runtime.Serialization.dll
命名空间 System.Runtime.Serialization.Josn
类:DataContractJsonSerializer
6.1.1 DataContractJsonSerializer 序列化
//程序集:System.Runtime.Serialization.dll
//命名空间 System.Runtime.Serialization.Josn
//类:DataContractJsonSerializer
System.Runtime.Serialization.Json.DataContractJsonSerializer masterJson = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(List<MartialArtsMaster>)); string strJson = String.Empty;
//序列化
using (MemoryStream stream = new MemoryStream())
{
masterJson.WriteObject(stream, masterList);
strJson = Encoding.UTF8.GetString(stream.ToArray());
}
Console.WriteLine(strJson);
运行结果如下:

注意:此种序列化,需要给类加上标记
6.1.2 DataContractJsonSerializer反序列化
//反序列化
List<MartialArtsMaster> newMasterList = new List<MartialArtsMaster>();
using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(strJson)))
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(List<MartialArtsMaster>));
newMasterList = (List<MartialArtsMaster>)serializer.ReadObject(ms);
}
string result = String.Empty; Func<List<Kongfu>,string> kongFu = delegate (List<Kongfu> kongfu) { string kflist = String.Empty; kongfu.ForEach(m => kflist += "武功名称:" + m.kongfuName + ";杀伤力" + m.lethality+"\n"); return kflist; };
newMasterList.ForEach(m => result += "大侠编号:" + m.id + " 大侠名字:" + m.name + " 年龄:" + m.age + " 门派:" + m.menpai + " \n所学武功:\n" + kongFu(m.kongFu)); Console.WriteLine(result);
运行结果如下:

6.2 Serialization,Deserialize
程序集:System.Web.Extensions.dll
命名空间:System.Web.Script.Serialization
类:Serialization,Deserialize
6.2.1 Serialization 序列化
//程序集:System.Web.Extensions.dll
//命名空间:System.Web.Script.Serialization
//类:Serialization,Deserialize
JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
//执行序列化
string strJson2 = jsonSerializer.Serialize(masterList);
Console.WriteLine(strJson2);
运行结果如下:

6.2.2 Deserialize 反序列化
//执行反序列化
JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
List<MartialArtsMaster> newMasterList = jsonSerializer.Deserialize<List<MartialArtsMaster>> (strJson2);
string result = String.Empty; Func<List<Kongfu>, string> kongFu = delegate (List<Kongfu> kongfu) { string kflist = String.Empty; kongfu.ForEach(m => kflist += "武功名称:" + m.kongfuName + ";杀伤力" + m.lethality + "\n"); return kflist; };
newMasterList.ForEach(m => result += "大侠编号:" + m.id + " 大侠名字:" + m.name + " 年龄:" + m.age + " 门派:" + m.menpai + " \n所学武功:\n" + kongFu(m.kongFu)); Console.WriteLine(result);
运行结果如下:

7. 注意事项:
可以使用IgnoreDataMember:指定该成员不是数据协定的一部分且没有进行序列化
DataMember:定义序列化属性参数
使用DataMember属性标记字段必须使用DataContract标记类否则DataMember标记不起作用。
默认情况下,不允许序列化。因此使用上述类进行序列化或反序列化时,一定要给类加上标记[DataContract]。
而使用第DataContractJsonSerializer,则不需要。
因此:
使用类:Serialization,Deserialize(命名空间:System.Web.Script.Serialization),可以实现快速序列化。
使用类:DataContractJsonSerializer,可以通过标记那些属性或字段需要序列化,进行局部序列化。
8.本节要点:
A.认识JSON:Javascript表示法,一种跨平台、轻量级数据交换格式;
B.认识JSON的两种格式
C.掌握在JS中使用JSON
D.掌握使用.NET自带的两个类进行JSON序列化和反序列化
使用类:Serialization,Deserialize(命名空间:System.Web.Script.Serialization),可以实现快速序列化。
使用类:DataContractJsonSerializer,可以通过标记那些属性或字段需要序列化,进行局部序列化。
==============================================================================================
<如果对你有帮助,记得点一下推荐哦,如有有不明白或错误之处,请多交流>
<对本系列文章阅读有困难的朋友,请先看《.net 面向对象编程基础》>
<转载声明:技术需要共享精神,欢迎转载本博客中的文章,但请注明版权及URL>
.NET 技术交流群:467189533 
==============================================================================================
[.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化的更多相关文章
- [.net 面向对象程序设计进阶] (1) 开篇
[.net 面向对象程序设计进阶] (1) 开篇 上一系列文章<.net 面向对象编程基础>写完后,很多小伙伴们希望我有时间再写一点进阶的文章,于是有了这个系列文章.这一系列的文章中, 对 ...
- [.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) Json 序列化利器 Newtonsoft.Json 及 通用Json类
[.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) Json 序列化利器 Newtonsoft.Json 及 通用Json类 本节导读: 关于JSON序列化,不能 ...
- [.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口 IXmlSerializable 实现XML序列化 及 通用XML类
[.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口 IXmlSerializable 实现XML序列化 及 通用XML类 本节导读:本节主要介绍通过序列 ...
- [.net 面向对象程序设计进阶] (9) 序列化(Serialization) (一) 二进制流序列化
[.net 面向对象程序设计进阶] (9) 序列化(Serialization) (一) 二进制流序列化 本节导读: 在.NET编程中,经常面向对象处理完以后要转换成另一种格式传输或存储,这种将对 ...
- [.net 面向对象程序设计进阶] (25) 团队开发利器(四)分布式版本控制系统Git——使用GitStack+TortoiseGit 图形界面搭建Git环境
[.net 面向对象程序设计进阶] (25) 团队开发利器(四)分布式版本控制系统Git——使用GitStack+TortoiseGit 图形界面搭建Git环境 本篇导读: 前面介绍了两款代码管理工具 ...
- [.net 面向对象程序设计进阶] (26) 团队开发利器(五)分布式版本控制系统Git——图形化Git客户端工具TortoiseGit
[.net 面向对象程序设计进阶] (26) 团队开发利器(五)分布式版本控制系统Git——图形化Git客户端工具TortoiseGit 读前必备: 接上篇: 分布式版本控制系统Git——使用GitS ...
- [.net 面向对象程序设计进阶] (2) 正则表达式 (一) 快速入门
[.net 面向对象程序设计进阶] (2) 正则表达式 (一) 快速入门 1. 什么是正则表达式? 1.1 正则表达式概念 正则表达式,又称正则表示法,英文名:Regular Expression(简 ...
- [.net 面向对象程序设计进阶] (4) 正则表达式 (三) 表达式助手
[.net 面向对象程序设计进阶] (2) 正则表达式(三) 表达式助手 上面两节对正则表达式的使用及.NET下使用正则表达式作了详细说明,本节主要搜集整理了常用的正则表达式提供参考. 此外为了使用方 ...
- [.net 面向对象程序设计进阶] (28) 结束语——告别2015
[.net 面向对象程序设计进阶] (28) 结束语——告别2015 <.net面向对象程序设计进阶>这一系列文章写了太长的时间了,大概有半年没写,在年底又一口气写了好几篇.在整个过程中目 ...
随机推荐
- 给IDEA设置单独的JDK
一.系统参数设置: 1.64位IDEA:增加IDEA_JDK_64系统变量 2.32位IDEA:增加IDEA_JKD系统变量 如图: 二.参考说明 https://intellij-support.j ...
- java-并发-不可变对象
浏览以下内容前,请点击并阅读 声明 当一个对象创建后的状态不可改变时就认为其为不可变对象,尽可能地利用不可变对象被公认为是构建简单可靠代码的有效方法.不可变对象在并发程序中比较有用,由于其状态无法改变 ...
- Python for Infomatics 第14章 数据库和SQL应用三(译)
14.5 SQL 总结 到目前为止,我们在Python示例程序中使用了SQL,并且涉及了许多SQL基础.在这一小节中,我们特别审视SQL语言,并对其语法进行回顾. 虽然有很多不同的数据库供应商,但因S ...
- T-SQL Recipes之Common Function
在我们写SQL的时候,经常会用到许多内置方法,简化了我们许多代码,也提高了效率,这篇主要总结一些常用的方法. ISNULL VS COALESCE VS NULLIF 在SQL中,NULL值是比较特殊 ...
- dom4j解析示例
收藏信息.xml <?xml version="1.0" encoding="GB2312" standalone="no"?> ...
- canvas实例 ---- 制作简易迷宫(一)
这个系列分为两部分,第一部分为迷宫的生成及操作,第二部分为自动寻路算法. 我们先看效果: See the Pen QGKBjm by fanyipin (@fanyipin) on CodePen. ...
- 读取hdfs文件之后repartition 避免数据倾斜
场景一: api: textFile("hfds://....").map((key,value)).reduceByKey(...).map(实际的业务计算逻辑) 场景:hdf ...
- 我的Windows Phone 8
学习Windows Phone 8开发,将自己收集到的学习资料做一个汇总(不断更新). 我的Windows Phone应用 DotaMax MyAppToStart 麦子学院 WP8.1版(UI简陋) ...
- sass sourcemap详细使用
新发布的Sass 3.3版本,将Source Maps正式纳入了Sass中.这也成为Sass新版本的一大亮点,一大新功能.让广大Sass爱好者可以直接在浏览器中更容易调试自己的代码和Debug相关操作 ...
- 基于shell脚本比较数字加减乘除
让用户输入两个数来比较他们的大小 先用touch命令新建一个2.sh文件 在用vi进入i进入编辑状态 输入 保存后检查