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

使用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的引用。

 

 

【开源专访】Fourinone创始人彭渊:打造多合一的分布式并行计算框架 API优先架构或者胖瘦服务器之争 Windows Phone 8迎来Update3更新:支持更大屏幕 更多磁贴 AMD院士站台 异构计算与OpenCL编程师资培训首站清华开讲 Twitter、Square开创者Jack Dorsey的奇趣人生 利用CSS、JavaScript及Ajax实现图片预加载的三大方法 经典电影里的数学 15亿美元!软银联合GungHo收购手游巨头Supercell Oracle“炮轰”开源:称其永远无法在军事领域取得一席之地 零客户端:下一代计算分布模型 苹果聘奢侈品公司巴宝莉CEO Angela Ahrendts为零售主管 看看你会几个?9大最火的移动开发技能 为了进一步拴住用户:传亚马逊与HTC合作开发智能手机 三年?又三年!今年MDCC2013大不相同! 杨远骋:聚美优品与百度云推送的故事 糗事百科王坚:百度云推送让我们省心 10个最热JavaScript开源框架的社区活跃度对比 2013福布斯中国富豪榜:李彦宏第三、马化腾第五、马云第八 Storm又获东风,Hortonworks计划将其整合到Hadoop企业版 IBM CEO:预测高新技术 五个我最喜欢的方式 我伙呆,硅谷高级工程师年薪16.5万美金起 羡煞旁人的Supercell:Clash of Clans卫冕营收榜冠军 谷歌第三财季利润增36.5% 但摩托罗拉业务继续亏损2.48亿 针对应用开发者的几点建议:注意特征蔓延、加大用户评审…… Ubuntu中文衍生版UbuntuKylin 13.10正式发布 Web设计师和Web开发者之间的区别是什么? 在政府退出后,Google的量子计算机项目面临危机 SQL on Hadoop的最新进展及7项相关技术分享 联想:欲收购黑莓,还能在智能手机领域创造PC神话吗? 谁说Android开发者的收入依然不行? 代码可维护性的神秘面纱 在Servlet中如何使用JavaBean(调用其中的方法)?主要是格式!如果网上有这方面的资料也可以告诉我,我急用,不胜感激!40分送上!(只有这些了) 请问各位:怎样才能知道某一个进程所占用的cpu比例,mem大小? 请问在恢复sql 7.0一个数据库文件时,出现Error 3624:这是什么意思?? 关于程序员考试 哪位知道怎么一行一行地读取文本文件呀!!!! 谁知道的,来帮我一下——有关网页浏览计时的问题 如何将数字变为字符串格式化输出? Websphere下使用连接池的一些问题 TNMUDP问题:怎样才能知道RemoteHost连接失败 ? 算法请教,我要调整一副黑白数字图的浓度,我是用直方图的方法好呢,还是先转成HLS在转回来好?若都不对,应该怎么做? 如何 在ASP中用ping 一个小问题 请用javascript VC++6是98年才出来的,为什么没有最新的ADO原生驱动,而通过ODBC的话速度太慢; 多媒体 谁有MPEG-4的资料! 如何实现类似资源管理器的分隔条 我是菜鸟,请教各位GG,MM?????? 我的计算字段怎么老要计算,而且经常有死循环,到底该注意些什么,在哪里控制? 如何取消鼠标右键菜单和使shift功能键无效?(紧急) 一个非常非常简单的一个问题 如何安装Jbuilder 5.0 ? 多媒体技术 chr(176)有什么用? 如何将3DMAX图片在vb窗口中显示 各位大侠,怎样取得复合数据窗口里面的嵌套表的Label名。 一个关于访问数据库很菜的问题 请教小波分解与重构,模极大值算法。 哪儿能找到com.ms.xml.*包? 动态类型判别 是怎么实现的,谁有小型模拟代码? 让程序自启动都有哪几种方式呀!各位发表发表吧!!!! sqlserver恢复问题! 有关STL的文章! 很简单的问题,送份啦!!! 求一个字符在字符串中的位置!? ********DBGrid和ADO怎样连接********* 在JBuilder 5.0中,我打开一个单独的java文件,怎么编译和运行他?用命令行方式是可以的 简单问题,applet??? 都说抽象类不能实例化,可是请看下面例子:(请大虾们解释) 谁有Borland App Server 4.51 注册码? Oracle中的奇特问题 快告诉我,如何取本机的静态IP地址。 数据库问题?得分率120%。对大虾而言 请教一个VC中包含DLL的workspace中 Link的设定问题! 程序员考试的成绩什么时候出来????? ********VC提取系统字体名称,然后将字体名称存入文本文件********* 我想让托盘图标实现动画效果,请问,能不能直接用动画图标啊?能的话就省事多了? 急!急!急!在html网页中怎样判断用户点击的对象,并利用脚本改变他的属性?给50分,决不食言! 在SQL*PLUS下怎样查看一个字段的属性,如是某一个字段是否为主关键字 DB2新手问题 请教:哪里有扩展Visualc++ MFC类库的详细资料下载? 征求ado+access时的建议:关于增加、删除、修改等操作到底用什么方法比较好?update、insert into还是post、edit? 11号到17号元素具有两性物质的化学式 水浒传中各个英雄的外貌描写的句子,是要句子,越多越好,最好全部 十万左右的车哪些款经济实惠? 化学中什么物质的化学式最具有代表性?就是说我要的这个物质化学式最能代表化学!一个典型的物质! 一辆长20米的货车和一辆长6米的汽车正以20m/s的速度一前一后在平直公路上匀速行驶,两车相距25米,现在汽车以0.5m/s^2的加速度超车,汽车超过货车30米后才从超车道进入行车道,求:①汽车超车 怎么快速给化学式配方 特别是x+x---x+x这样的 有什么窍门么 求科学大人指点 初中化学中能不能从化学式中判定物质呈什么性NA2CO3 碳酸钠 呈碱性的,因为有碳酸,所以我总是认为是酸性,诸如此类的问题,让我很苦恼,. 一辆长20m的货车和一辆长6m的汽车正以20m/s的速度一前一后在平直公路上匀速行驶,俩车相距25m,现汽车以0.5m/s²的加速度超车,汽车超过货车30m后才从超车道进入行车道;(1)汽车超车所用 尽量弄发就全发上来~还要标明中学~不然看不懂的, 天然气化学式为(),具有()性 你妹妹最喜欢什么电视节目的英文 如图,居民楼A与马路l相距60米,在距离载重汽车P100米处就可受到噪音影响,试求在马路上以18千米/时的速度行驶的载重汽车给A楼的居民带来多长时间的噪音? 把句子写完整1;新房的客厅很大.2东方明珠电视塔很高 用英语写【你最喜欢的节目】这句话 由于居民楼A与马路A相距60m 且距离汽车100m处就可受到噪音影响用勾股定理可算出 一辆值勤的警车停在公路旁,当警员发现从他旁边以v=8m/s的速度匀速行驶的货车有违章行为时,决定前去追赶经过2.5s,警车发动起来,以加速度a=2m/s做匀加速运动,试问:1、警车要追赶多长时间才 你最喜欢的电视节目是什么?英语 如图,居民楼A与马路l相距60米,在距离载重汽车P100米处就可受到噪音影响,试求在马路上以18千米/时的速度行驶的载重汽车给A楼的居民带来多长时间的噪音? 照例句写句子例:烟台的海,是一幅画,是一道广阔的背景,是一座壮丽的舞台.秦始皇兵马俑,是( ),是( ),是( ). 氯化钠的化学式 某居民楼A与它前面马路相距60m,如果有载重汽车在马路上行驶,在距离载重汽车100m处居民就会受到影响,试求在马路上以45km/h的速度行驶的载重汽车在A楼的居民带来多长时间的噪音? 一辆值勤的警车停在公路边,当警员发现从他旁边以8m/s的速度匀速行驶的货车有违章行为时,决定前去追赶,经过2.5s警车发动起来,以0.5m/s2 的加速度匀加速运动.问: 1、警车要多长时间才能追 氯化钠 仿写句子爱是什么 写一个既是比喻句又是夸张句的句子 氯化钠的化学式是什么 爱是什么 仿写6句语文书第二课课后练习题鄂教版六下 一辆值勤的警车停在公路边.当警员发现从他旁边以v=8m/s的速度匀速行驶的货车有违章行为时,决定前去追赶若警车最大速度为16m/s,多长时间可以追上?题目中还有2.5s后汽车发动 把句子补充完整:电视塔附近生长着( ) 以我们爱你——为起句仿写课文“我们爱你啊,中国”2~6自然段 英语翻译There are eleven beautiful globes of different sizes from the green grassland to the blue sky with two large globes. 在下列句子中填上“站立”的近义词,不能重复 1 电视塔()在对面的小山上 2 远远望去,群山( ),连绵不绝 中国的100M短跑记录是多少?是谁? 一辆值勤的警车停在公路旁,当警员发现从他旁边以v=15m/s的速度匀速行驶的货车有违章行为时……一辆值勤的警车停在公路旁,当警员发现从他旁边以v=15m/s的速度匀速行驶的货车有违章行为时 按要求改写句子(四年级上册基础训练)1.谁也没有想到,一个孩子竟有如此的胸怀.(改为反问句).2.中国的孩子怎么会缺少生活乐趣呢?(改为陈述句).3.人类靠现代科学技术呼风唤雨.(改 珍珠由哪些成分组成? 一辆值勤的警车停在公路边,当警员发现从他旁边以v=8m/s的速度匀速行始的货车有违章行为时,决定前去追...一辆值勤的警车停在公路边,当警员发现从他旁边以v=8m/s的速度匀速行始的货车有违 稀硫酸的化学式 什么是尼龙?是什么成份?化学式是怎样? 钟乳石形成过程,用化学式表示 钠和硫酸铜反应的化学式 关于稀硫酸的化学式关于稀硫酸的;证明‘银粉’的成分是铝不是银.这句话怎么写化学式?急求. 钟乳石的形成如题 钠与硫酸铜反应蓝色沉淀中混有黑色沉淀,黑色沉淀是什么,为什么会生成黑色难容物? 稀硫酸的化学式是什么 翻译一个句子:“他七点钟回家,然后看电视里的早间新闻”用英语表示 钠与硫酸铜溶液反应为什么不生成单质铜,也就是为什么Na先和水反应再和硫酸铜反应?既然是溶液就应该是均一稳定的,应该是同时遇到才对。 硫酸钠与稀硫酸反应的化学式急用! 英语翻译你在干什么?我在看电视.我的弟弟正在游泳池里游泳.凯特的表弟正在吃晚饭吗?是的.感谢你的来信和照片.他正在等公共汽车. 求水浒传中描写人物外貌的句子(要15个) 稀硫酸为什么有化学式?它不是混合物吗? 仿写句子,与读书和看电视有关如果把阅读比喻成细嚼慢咽的宴席,荧光幕前的观赏就是便捷的快餐,是可口的零食.一样是吃的享受,韵味却不相同. 水浒传中描写武松外貌的句子 带有(我爱文静)的藏头诗 把上面的两个句子合并成一个句子:妈妈叫我.我看电视. 急求水浒传里描写神态的句子1000字 买什么样的家庭轿车最经济实惠?我想购一辆5-8万元的家用轿车,但不知买那个品牌的最经济实惠,请朋友们帮我参谋参谋, “你好我在看电视那” 这句话我想用外语句子怎么写 水浒传外貌描写30句速求, 现在价位在7万左右的家庭轿车最经济实惠
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn