[.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化

[.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化

本节导读:

介绍JSON的结构,在JS中的使用。重点说明JSON如何在.NET中快带序列化和反序列化。最后介绍在使用.NET序列化JSON过程中的注意事项。

读前必备:

A.泛型       [.net 面向对象编程基础]  (18) 泛型

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 = 1,
    name = "令狐冲",
    age = 23,
    menpai = "华山",
    kongFu = new List<Kongfu>() { new Kongfu() { kongfuName = "独孤九剑", lethality = 100 }, new Kongfu() { kongfuName = "易筋经", lethality = 100 } },
    level = 10
});

masterList.Add(new MartialArtsMaster()
{
    id = 2,
    name = "黄药师",
    age = 55,
    menpai = "桃花岛",
    kongFu = new List<Kongfu>() { new Kongfu() { kongfuName = "弹指神通", lethality = 100 } },
    level = 10
});

masterList.Add(new MartialArtsMaster()
{
    id = 3,
    name = "段誉",
    age = 20,
    menpai = "天龙寺",
    kongFu = new List<Kongfu>() { new Kongfu() { kongfuName = "凌波微步", lethality = 100 }, new Kongfu() { kongfuName = "六脉神剑", lethality = 100 } },
    level = 10
});

masterList.Add(new MartialArtsMaster()
{
    id = 4,
    name = "乔峰",
    age = 33,
    menpai = "丐帮",
    kongFu = new List<Kongfu>() { new Kongfu() { kongfuName = "降龙十八掌", lethality = 100 }, new Kongfu() { kongfuName = "打狗棒法", lethality = 100 } },
    level = 10
});

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   

==============================================================================================

时间: 2024-07-30 10:18:53

[.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化的相关文章

[.net 面向对象程序设计进阶] (1) 开篇

[.net 面向对象程序设计进阶] (1) 开篇 上一系列文章<.net 面向对象编程基础>写完后,很多小伙伴们希望我有时间再写一点进阶的文章,于是有了这个系列文章.这一系列的文章中, 对于.net 基础的一些知识,推荐小伙伴们阅读一下我上一系列文章<.net 面向对象编程基础> ,也就是说本篇文章在阅读前,最好是掌握了.net 的基础知识. 首先,“.net 面向对象程序设计进阶”这一系列的文章涉及的范围比较广,每一节相当于.net的一个分支,基本可以作为一个独立的课题了.只所以

[.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) JSON序列化利器 Newtonsoft.Json 及 通用Json类

[.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) JSON序列化利器 Newtonsoft.Json 及 通用Json类 本节导读: 关于JSON序列化,不能不了解Json.net(Newtonsoft.Json)这款世界级的开源类库,除了拥有良好的性能之外,功能也是非常强大的. 本节会详细说明这个类库.此外,对于不喜欢使用第三方类库的同学,会整理一个基于微软类库的通用Json类. 读前必备: 本节主要介绍一款第三方类库和一个自己整理封装的类库,说起到封装

[.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口IXmlSerializable实现XML序列化及XML通用类

[.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口IXmlSerializable实现XML序列化及XML通用类 本节导读:本节主要介绍通过序列化接口IXmlSerializable实现XML序列化和反序列化,整理了XML基础操作及序列化的通用类(包括XML及节点的基础读写操作,XML到DataSet\DataTable互转换操作,XML序列化及反序列化通用方法等). 读前必备: A.类和类的实例 [.net 面向对象编程基础]  (9) 类和类的

[.net&#160;面向对象程序设计进阶] (9) 序列化(Serialization) (一) 二进制流序列化

[.net 面向对象程序设计进阶]  (9)  序列化(Serialization) (一) 二进制流序列化 本节导读: 在.NET编程中,经常面向对象处理完以后要转换成另一种格式传输或存储,这种将对象转向其他数据格式的过程,即序列化(Serialization). 与之相反的过程就是反序列化(Deserialization).掌握和利用好序列化和反序列化的方法,对提高面向编程技术很有益处. 读前必备: A.类和类的实例  [.net 面向对象编程基础]  (9) 类和类的实例  B.类的成员

[.net 面向对象程序设计进阶] (26) 团队开发利器(五)分布式版本控制系统Git——图形化Git客户端工具TortoiseGit

[.net 面向对象程序设计进阶] (26) 团队开发利器(五)分布式版本控制系统Git——图形化Git客户端工具TortoiseGit 读前必备: 接上篇: 分布式版本控制系统Git——使用GitStack+TortoiseGit 图形界面搭建Git环境 http://www.cnblogs.com/yubinfeng/p/5182271.html 本篇导读: 上篇介绍了一款Windows环境下的Git服务器工具GitStack ,搭建了最简单的Windows下的Git服务器,需要再次提醒的是

[.net 面向对象程序设计进阶] (2) 正则表达式(一)

[.net 面向对象程序设计进阶] (2) 正则表达式(一) 1.什么是正则表达式? 1.1正则表达式概念 正则表达式,又称正则表示法,英文名:Regular Expression(简写为regex.regexp或RE),是计算机科学的一个重要概念.他是用一种数学算法来解决计算机程序中的文本检索.区配等问题. 1.2正则表达式语言支持  正则表达式其实与语言无关,在很多语言中都提供了支持 ,包括最常用的脚本语言Javascript.当然C#语言也毫不例外的提供了很好的支持.     正则表达式语

[.net 面向对象程序设计进阶] (4) 正则表达式 (三) 表达式助手

[.net 面向对象程序设计进阶] (2) 正则表达式(三) 表达式助手 上面两节对正则表达式的使用及.NET下使用正则表达式作了详细说明,本节主要搜集整理了常用的正则表达式提供参考. 此外为了使用方便,编写了一个<正则表达式助手>方便测试正则表达式. 1.正则表达式助手 1.1 软件概述 软件名称: <正则表达式助手> 版本: 1.0 最后更新日期: 2015/07/01 作者: YuBinfeng 运行环境: .NET Framework 4.6及以上(常用表达式功能,需要联网

[.net 面向对象程序设计进阶] (23) 团队开发利器(二)优秀的版本控制工具SVN(上)

[.net 面向对象程序设计进阶] (23) 团队开发利器(二)优秀的版本控制工具SVN(上) 本篇导读: 上篇介绍了常用的代码管理工具VSS,看了一下评论,很多同学深恶痛绝,有的甚至因为公司使用VSS离职的.其实使用什么代码管理工具要看项目而定.毕竟使用何用代码管理工具,是项目管理者根据需要来决定的,如果你是一个开发人员,首先要让自己的技术精进一点.下面根据我个人理解,把这几种常见的代码管理工具使用场景简单介绍一下. 1.几种代理管理工具的适用场景 A.如果你的项目是5-6人的小团队,那么使用

[.net 面向对象程序设计进阶] (2) 正则表达式 (二)

[.net 面向对象程序设计进阶] (2) 正则表达式 (二) 上一节我们说到了C#使用正则表达式的几种方法(Replace,Match,Matches,IsMatch,Split等),还有正则表达式的几种元字符及其应用实例,这些都是学习正则表达式的基础.本节,我们继续深入学习表达式的几种复杂的用法. 1.分组 用小括号来指定子表达式(也叫做分组) 我们通过前一节的学习,知道了重复单个字符,只需要在字符后面加上限定符就可以了, 比如 a{5},如果要重复多个字符,就要使用小括号分组,然后在后面加