说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

使用DataContractJsonSerializer进行JSON序列化的JSONHelper类

HTML文档下载 WORD文档下载 PDF文档下载
在ASP.NET 2.0的 AJAX Extensions v1.0中有一个JavaScriptSerializer类提供了JSON序列化及反序列化的函数。在.NET 3.5中JavaScriptSerializer 已被标记为"过时"。.NET 3.5中新的JSON序列化对象是DataContractJsonSerliaizer,我们需要了解一些新的东西。

作者:Chris Pietschmann

翻译:好库编程网 好饱

 

在ASP.NET 2.0的 AJAX Extensions v1.0中有一个JavaScriptSerializer类提供了JSON序列化及反序列化的函数。在.NET 3.5中JavaScriptSerializer 已被标记为"过时"。.NET 3.5中新的JSON序列化对象是DataContractJsonSerliaizer,我们需要了解一些新的东西。

 

序列化对象

 

创建一个对象Person,拥有FirstName和LastName属性

 

public class Person{    public Person() { }    public Person(string firstname, string lastname)    {        this.FirstName = firstname;        this.LastName = lastname;    }    public string FirstName { get; set; }    public string LastName { get; set; }}

 

 

 

现在,为了能够让我们的对象通过使用DataContractJsonSerializer转化为JSON,我们需要让为它加上Serializable或者是DataContract属性。

 

 

/// Marked with the Serializable Attribute[Serializable]public class Person{    public Person() { }    public Person(string firstname, string lastname)    {        this.FirstName = firstname;        this.LastName = lastname;    }    public string FirstName { get; set; }    public string LastName { get; set; }}/// Marked with the DataContact Attribute[DataContract]public class Person{    public Person() { }    public Person(string firstname, string lastname)    {        this.FirstName = firstname;        this.LastName = lastname;    }    [DataMember]    public string FirstName { get; set; }    [DataMember]    public string LastName { get; set; }}

 

 

 

序列化代码:

实现Person序列化的基本代码:

 

Person myPerson = new Person("Chris", "Pietschmann");/// Serialize to JSONSystem.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(myPerson.GetType());MemoryStream ms = new MemoryStream();serializer.WriteObject(ms, myPerson);string json = Encoding.Default.GetString(ms.ToArray());

 

生成的JSON结果:

 

/// Person对象添加了Serializable属性,序列化后的结果如下:{"<FirstName>k__BackingField":"Chris","<LastName>k__BackingField":"Pietschmann"}/// 如果标记了DataContract,每个属性标记为DataMember,结果为:{"FirstName":"Chris","LastName":"Pietschmann"}

 

 

 

正如你可以看到第一个序列化的类用Serializable属性标记并不完全符合我们的预期,但仍然是JSON。这种序列化实际上与ASP.NET AJAX客户端JSON序列化是不兼容的。

 

正如你可以看到第二个标有DataContract属性序列化的类正是我们所期待的是的,旧的的JavaScriptSerializer对象会产生相同的JSON。此方法是使用JSON序列化DataContractJsonSerializer,你可以将该结果传递到客户端供ASP.NET AJAX使用。

 

 

反序列化代码

 

基本代码:

 

Person myPerson = new Person();MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json));System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(myPerson.GetType());myPerson = serializer.ReadObject(ms) as Person;ms.Close();

 

 

 

控制JSON结果中的属性名称:

使用DataContract和DataMember属性, 你可以在DataMember属性里用"Name"参数指定名称,例子如下:

 

[DataMember(Name = "First")]public string FirstName { get; set; }

 

结果:

 

{"First":"Chris","LastName":"Pietschmann"}

 

下面的JSONHelper使用泛型,能使你的工作轻松些:

 

using System.Runtime.Serialization;using System.Runtime.Serialization.Json;public class JSONHelper{    public static string Serialize<T>(T obj)    {        System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(obj.GetType());        MemoryStream ms = new MemoryStream();        serializer.WriteObject(ms, obj);        string retVal = Encoding.Default.GetString(ms.ToArray());        ms.Dispose();        return retVal;    }    public static T Deserialize<T>(string json)    {        T obj = Activator.CreateInstance<T>();        MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json));        System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(obj.GetType());        obj = (T)serializer.ReadObject(ms);        ms.Close();        ms.Dispose();        return obj;    }}/// Our Person object to Serialize/Deserialize to JSON[DataContract]public class Person{    public Person() { }    public Person(string firstname, string lastname)    {        this.FirstName = firstname;        this.LastName = lastname;    }    [DataMember]    public string FirstName { get; set; }    [DataMember]    public string LastName { get; set; }}/// Sample code using the above helper methods/// to serialize and deserialize the Person objectPerson myPerson = new Person("Chris", "Pietschmann");// Serializestring json = JSONHelper.Serialize<Person>(myPerson);// DeserializemyPerson = JSONHelper.Deserialize<Person>(json);

 

我的应用程序需要什么样的程序集引用?

 

包含命名空间DataContractJsonSerializer,你可能会说,你需要添加System.Runtime.Serialization的引用。但是,你还需要添加System.ServiceModel.Web的引用。

 

 

用VB6.0制作画图板 用VB6设计有趣的动画场景 用VB编程绘制网格图像 用VB绘制抛物线动画曲线 用VB绘制正弦动画曲线 用VB实现“百叶窗”的图形特效 用VB实现托盘动画图标 用Visual Basic 定制BMP文件 用Visual Basic的Move方法实现动画效果 用Visual Basic与MS-Draw开发通用作图软件 在VB中获取可执行文件及Windows 95快捷方式的图标 在VB中进行各种图形切换的方法 在VB中制作可滚动的图像显示 在图片上平滑移动文字 -VB资料 VB怎样使程序的标题条闪烁? VB制作图像的Mask图 CWinInetConnection-一个封装了WinInet API函数的类 -VB资料 MODEM通讯意外处理-VB资料 MsComm 文字传输-VB资料 PING一个IP地址(向它发送一个数据包并等待回应) -VB资料 SMTP协议简介 (Simple Mail Transfer Protocol) -VB资料 VB5.0 中远程数据库的访问 VB下如何编写CRC校验程序 Visual Basic 6中发送邮件的新方法 Visual Basic通信程序设计 Whois 示例程序-VB资料 Winsock Terminal示例程序 -VB资料 WinSock断开导致客户端问题-VB资料 把Outlook信箱中的附件另存为 -VB资料 保证连网计算机时间同步-VB资料 编写网络寻呼机 -VB资料 如何得到文件的长度,很简单的问题 脚本错误? 物化视图的数据整理问题 如何实现把一个BMP等比例缩放. 强烈建议版主封掉 theHanOfCC(我流) 的ID,他是一个人渣!! 同意的请进来签名!!! 在校程序员的困惑 有关PB数据窗口的检索参数 哪里有比较多的计算机书籍下载,请推荐几个。 急~~~高分求救~! 谢谢duduwolf,请来领分 类似这样的字符串“Thu Sep 5 14:05:56 2002”,怎么转化为Date对象? 安装问题,很简单,小弟菜鸟,望各位兄长多多关照啦!谢了! MDI窗口出错 新手请教。如何在cgi程序中得到由url传递过来的值 ISA 2K发布多个WEB 服务器问题,(我都要疯了) 我的xp怎么不能装vc6.0?再线等待!(20分) 急~~~高分求救~! 请教各位师兄。这个可以实现吗? 向高手请教(如何把客户端的图片传到服务器?) 各位大虾.水晶报表的关键一步了.实现了我就可以水晶报表的打印了! 急急!!!!怎样才能取得java函数传过来的参数呢? %%%%非高手勿進%%% CSDN有些人素质太差! IShellFolder::GetDisplayNameOf 如何获得全名? 代理Type分别为transparent,anonymous,high anonymity,优劣? 为感谢computersim在大力相助,特奉送100分,快来拿啊 请教网上书店系统的设计思想和例子。 VC中使用FLASH的OCX控件如何取得Movie的原始大小,且如何按指定比例缩放?问题解决后必给分。 有关“隐藏”,“覆盖”的一些问题: 如何把A库中A表原样复制到B库中去? 怎样取得鼠标点击DataGrid控件时是哪一行,哪一列呢?(C#) ISA 2K发布多个WEB 服务器问题,(我都要疯了)高分求救 这个问题怎么办?? (ADO OPEN) Up 有分! 母亲生日,你觉得送什么礼物为好? 用c++ 写的 hello 程序在unix g++ 编译通过后,运行出错 如下几个初级问题要问,高手们请进-> SQLSERVER高手进来聊聊........ 怎样用代码实现两台电脑之间的文件传输? 哪位知道Microsoft Firewall Client 的下载地址? 关于RECORDset的问题,求教 如何在web页面使用 Windows 窗体控件,最好有例子! 使用DOM的XMLHttpRequest对象来发送xml请求,但当返回的响应带有中文时候,在PDA上无法正常显示,我使用MultiByteToWideChar也没用。有人 请问在窗口中放置控件时,PB是否有靠近格线对齐的功能。如果有,在哪设置? DELPHI中FASTNET组件使用方法 请问在SELECT查询中怎样娶得行号? 在一般的类中如何得到当前文档的指针? 巨菜问题:重装xp后grub启动菜单消失,怎么办? FIP上传问题,非常着急,在线等,解决就结贴, 用javaScript打开窗口后,原窗口的gif动画不动了 FindWindow的用法 反正没几个人能回答,发来玩玩。 RNA这种生物大分子都是以DNA分子为模板转录而来的,为什么错 明矾净水中铝离子的 水解生成氢氧化铝用加沉淀符号吗? 关于武士刀刀剑的打磨知识,请问经常打磨刀,看了个文章是关于龙泉宝剑的打磨与保养,就想家里的菜刀一样需要打磨,如果经常使用就会变的不利.如果买的好刀,也经常打磨的话,会不会以后就 将酵母菌研磨离心后,得到上清液... 明矾净水是破坏胶体稳定性的现象吗 下列物质合成时,不须氮源的是 A.三磷酸腺苷 B.酪氨酸酶 C.脂肪酸 D.核酸 为什么? “元素”一词如今已被广泛运用,如媒体经常使用的“音乐元素”、“时装元素”、“车元素”.请查阅辞海,了解"元“和“素”各有哪些含义?你认为广泛使用的“元素”一词与我们化学上所 明矾净水原理的离子方程式有可逆符号吗?书上为什么没有?不是水解吗? 脂肪酸的合成中,哪个步骤消耗ATP 注意,是合成 都有哪些描写缘分的诗句啊? 明矾净水和胶体有关吗?原理? 中国历史上哪些王朝是由汉民族建立的?并请对开过皇帝做个简单的介绍,尤其是其血统, 俄罗斯紫金的化学元素是什么?是化学元素看明白哈 有哪些动物有生物钟,是什么样的,请详细回答,起码要16种动物. 蜡、冰变为液体的时候密度会改变么、固体大还是液体大、本人没学好、解答一下、 缘 求 ,这个词语是什么 动物的生物钟是指()A、生物体内的一种能感知时间变化的生理结构B、动物对阳光的强弱变化比较敏感的器官C、生物生命或的内置节律性D、动物体内的有中标性质的器官请说明选择的原因 蜡和冰凝固前后的质量、体积和密度有什么不同? CN是什么化学元素就是KSCN里的CN.它是啥?中文名? 你知道哪些动物有生物节律是昼夜节律啊 刀在石上磨 人在世上练 怎么写片段呀? 含缘的诗句 动物生物钟受环境什么变化的影响? ( )在世上炼,( )在石上磨和磨练有关的谚语 有关缘分的名言或诗歌或俗语比如有 缘千里来相会,无缘对面不相识 前世五百次回眸换得今世擦肩而过 之类的 《汉谟拉比法典》与《十二表法》有什么不同?书上不是说都是历史上的第一部有文字记载的法典么? 青藏地区城镇沿河谷分布的原因 矿泉水中含有的微量元素及其作用? 罗马法与汉谟拉比法典有什么区别 水包水多彩漆哪个品牌好啊‘ 关于九年级化学元素的简单问题,求答元素是具有相同核电荷数的一类原子的总称.1 元素指的是原子吗?2 如果一个原子的核电荷数是8,那它一定就属于氧原子吗?核电荷数是8的只有氧原子吗? 汉谟拉比法典法典宣扬"君权神授"它还规定"奴隶可以用来买卖,用来抵债.1.这是哪个地方的法律条文2.这些条文反映了什么制度?说明什么问题?3.制定的目的是? 会带来什么影响 请从物理的角度分析为什么磨刀不误砍柴工 一道简单的判断化学元素的题A B C D 四种元素的原子序数均小于18,其最高正价数依次为1 4 5 7.已知B的原子核外次外层电子数为2.A C 原子河外次外层电子数为8.D元素的最高正价氧化物对应的水 新加坡南洋理工大学怎么样? 用物理角度分析为什么:磨刀不误砍柴工 化学元素最简单题!尽快,10分钟内解决!1,W,X,Y,Z四种为短周期元素,且核电荷数依次递增,W的原子核内仅有一个质子,X原子的电子总数与Z原子最外层电子层数相等,W原子与X原子的最外层电子书之 什么叫做毛煤? 红日的主要内容(200字)要易懂,不少于200字的.半小时后停止提问,并进行评选.采纳满意回答可获得2分经验值奖励、提高悬赏. 求利比亚的现在的民主状况?利比亚,长达几个世纪的封建,一时间就变革,我想知道是否真的民主了!还是又一个托 zn是什么化学元素 生命究竟有多长? 注射模由哪几部分组成?各部分作用是什么? 求所有化学元素的表示如水H2O 我知道2是小2 O2氧等的.有多少要多少!我马上升初二了想提前学下初三的. 黑暗史诗必备的英语别跟我说没有,任务属性什么的全是英文的 注射模中模具的温度调节的作用 缘爱 用英语怎么说?最好用一个单词 黑暗史诗既然是英文的,那它的任务我怎么看的懂呢我昨天下的还没玩在看那些必须用到的次的翻译但是我想它的任务如果也是英文的我怎么看的懂呢靠这个游戏是完全英文的你知道不郁闷夜 井水中锰含量超标20倍用什么办法处理我们家饮用的井水中锰含量2.3508mg/l,请问可用什么方法处理才可以把其中的锰清除掉 有人说“饮用天然矿泉水对人体有益,矿泉水中微量元素的含量越多越好,对吗? 黑暗史诗 都是英文, 什么是生物大分子?为什么核糖核酸是生物大分子thank “爱情是讲缘分的”用英语怎么说 电动车功率多大的 铁锰超标的井水抽上来后经沉淀能去除铁锰吗 那种矿泉水含有对人体有益的微量元素多 用物理知识回答为什么磨刀不误砍材功 农村井水铁含量超标该怎么办?经检验,铁含量比正常值超一倍,该怎么处理呢?代表全村百姓先谢谢了! 矿泉水微量元素的含量是否越多越好?为什么? 磨刀不误坎柴工,所涉及的物理知识是什么
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘