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

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

 

 

支持Swift!全新“四步测”BDD框架Quick诞生 中国式移动办公 纷享销客完成B轮融资千万美元 打造完美用户体验:“天翼平台开放日”沙龙纪实 我的编程认知:多思考、多编码、多测试 聚焦应用开发 2014年微信开发者大会即将召开 继续补Bug,jQuery Mobile发布1.4.3版本 手游SDK服务商棱镜公司获A轮投资 东方弘道领投 广而告之:Databricks终止Shark项目,转至Spark SQL DeNA China副总裁黄雪斌:IP战国时代的生存法则 巴别时代首席执行官赵暕:从页游到手游的完美转身 Oracle借助RESTFUL API扩展移动端版图 优秀求职者应主动问的5个问题 高德LBS智能硬件编程马拉松:硬件复兴,等你挑战! 首届bong线上黑客马拉松:运动数据分析应用bong+获大奖 英特尔推出基于WebRTC的协同通讯方案 凸显本土创新“软”实力 一周消息树:不同设备不同界面的Windows 9正在逼近! 乐卓网络CEO李澄澄:移动游戏IP是把双刃剑 高性能动画!HTML5 Canvas JavaScript框架KineticJS Swift最酷炫的七大功能 微信开发者大会讲师介绍:柳峰与你一起玩转公众平台应用开发 TIOBE 2014年7月编程语言排行榜:仅发布1月,Swift进Top 20! 艾格拉斯CEO王双义:手游自研引擎的荣耀之路 以招行为例,深圳云软黄榕振谈微信公众帐号企业应用高级开发 来自前苹果高管Heidi Roizen的经验之谈 【短讯】Dropbox、微软OneDrive打不开,国内用户该如何应对? 5分钟弄懂Docker! RakNet:被OculusVR收购的跨平台游戏网络引擎 Qualcomm业务拓展副总裁沈劲:智能终端的延伸 苹果发布Xcode 6 Beta 3,Swift迎来重大更新! Linkedln技术高管Jay Kreps:Lambda架构剖析 《近匠》极光推送:聚焦巨头无法快速转身的领域 如何在一串字符中区分汉字和字母,就是去除字母只留汉字 如何截获另外一个进程调用的函数,比如OUTTEXT(。。 高分获取sql server相关资料的网站/电子书等 Going to die ActiveForm程序如何得到参数? The Glass Eye sqlserver+asp如何实现图像的存储和显示? Just plain stupid 关于main(int argc,char *argv[]) helpme 如何对vb源代码加密 讨论,关于Swing做的Applet! SUN前途堪忧! explorer007(KKcat):麻烦一下,请把你写的游戏TANK的源代码给我发一份(lyf545@263.net),谢谢!!!! sql server中删除一条记录不成功!? Bad Dream about a Coffin 我要用delphi作个学生管理系统,大家给点意见 有声卡,为何没有声音,具体操作如何?一定加分!!!! What a country ! 交流交流多线程程序的开发经验好吗? 谁有关于ejb方面的书或者资料推荐??一定给分 Women over 50 谁编个例程给我,这50分就是谁的了。题目不难,相信高手5分钟就能做完。 jdk1.3+jswdk1.0.1 的JAVAbeans .class文件要放哪啊????? God painted it 提问:猪真的很幸福吗?要求 wywq(幸福如猪) 回答。 哪位高手做过可视电话的? VB能不能实现“一个结构体类型的数组当参数传递 Forgotten Birthd Husbands Overheard Fine 有个在多线程中使用ADO的问题。请高手们帮忙。 Suede jacket 可能是installshield的Bug! 我想去北京找个工作,请大家帮帮忙,提供点信息! 装了“猫”为何还有630错误(电话线也接了)? excel 問題 各位:数据窗口有一检索变量,现在想retrieve出所有的记录,检索变量应该怎样赋值?谢谢! linux和windows是不是只能分别装在两个分区中 关于图像处理:如何使图像锐化与柔化? 帮帮我啦! 我在使用jdbc读取数据的时候,碰到了内存溢出的问题,怎么回事呀 哪里有餐饮系统的介绍?90不够的话,先欠着,多谢了! 在两个ASP程序之间怎么传递参数? ccl2000(不帅不酷的Goblin):其实你真的很酷很帅的。 大侠帮帮我啦(关于SQL语句的问题) 关于Vxd的编译问题 用VC编的程序,一运行就说“执行非法操作”,问题出在哪里?? SQL Server有病 一个关于api的简单问题 《易佳自定义报表》用后很失望 请教各位高手一个有关报表控件的问题? 小妹向大家请教!可不可以直接在本页的代码中改变该页面浏览时的属性? .密度计是测量___ 的仪器.把它放在密度较大的液体中,它排开的液体体积 则-------【填较大或较小】 现有一堆土豆,要测量它的密度.工具材料有:一个弹簧测力计,一团细线,一把厘米刻度尺和菜刀.现在请利用以上材料测出土豆的密度. 怎样快捷焊修燃油箱防止油箱爆炸? 测量液体密度的仪器叫做密度计.将其插入被测液体中,待静止后直接读取液面处的刻度值(图10.3-9甲).图10.3乙和图10,3-9丙是自制的简易密度计,它是在木棒的一端缠绕一些铜丝做成的.将其放入 一个弹簧测力计,一团线,一把厘米刻度尺和菜刀.利用这些工具测出土豆的密度(步骤,计算公式) 油箱长3.6米宽0.1米油的密度是0.85怎么去算油箱的容量和每0.1米油箱的容量 1瓶果汁“净含量600ml”如果用天平称这瓶果汁质量为720g,这瓶果汁密度多少 只有一个弹簧测力计,一团细线,一把厘米刻度尺和菜刀,怎么测土豆的密度? 油罐着火在什么情况下会爆炸? 各种水果汁的密度(或哪种比哪种沉也可以)帮我解答一下吧!越多越好 密度为0.82的酒精配制步骤我需要配制密度为0.82的酒精该如何配制,具体步骤是怎么样的呀, 子弹内部是靠什么爆炸的不会是TNT吧,这种东西好象爆炸时没有烟,这种东西可以拿什么替换(可以通过合法渠道搞到的象汽油这种易燃易爆品)要成分状的 巧量铁丝的长度.已知铁丝密度为P,质量为Mmg,小明用了一把刻度尺和一支圆珠笔就解决问题 .问小明是如何解决的,写出有关操作步骤,小明的计算公式(用有关量的字母表示),为了减少误差应 自制葡萄酒前期酒精发酵动力不足,有什么办法可以激活酒精发酵 弹药爆炎弹二次爆炸什么意思怪是不是会受到两次攻击比如打下去100点伤害,然后有爆炸又100点伤害{我说的是增加的那百分之65攻击}具体点, 小明用一满瓶纯净水和放在水平桌面上的海绵做实验做着做着小明想,一瓶纯净水能产生多大的压强,竟把海绵压陷得那么明显.于是就开始想办法计算它.他从商标纸上查到这瓶水的“净含 自制葡萄酒必须两次发酵吗,只发酵一次可以吗? 子弹撞击子弹会爆炸吗?我们都知道当两辆车的时速都很快的时候 撞击在一起 汽车便会产生惊人的爆炸力 但那里头毕竟有发动机 石油 这些易燃的东西 如果是两颗子弹相撞呢?是否也会爆炸 从5瓶不同的纯净水,2瓶不同的可乐和6瓶不同的果汁中,拿出2瓶不同类型的饮料,共有多少种不同选法? 自制葡萄酒 二次发酵要不要密封?上个月21号做的,今天刚把渣滤掉.现在分装在几个洋酒瓶中,是塑料螺旋盖的,请问要不要拧紧? 子弹为什么可以爆炸啊? 从5瓶的纯净水,2瓶不同的可乐和6瓶不同的果汁中,拿出2瓶不同类型的饮料,共有多少种不同的选法? 油罐上为什么要装呼吸阀? 子弹焚烧时会不会爆炸 小明用刻度尺、两端开口的玻璃管、橡皮膜和水等器材测盐水的密度操作步骤如下:①将玻璃管的一端扎上橡皮膜并倒入水,出现图甲所示的现象,说明水对____有压强.②用刻度尺测出玻璃管 油罐呼吸阀日常检查和维护应注意哪些问题,怎样检查其是否正常工作? 子弹的燃烧爆炸需要外界的氧气参与吗?1,子弹内部火药燃烧是与(氧气反应)还是和(氧化剂反应的)?2,这些氧气或氧化剂来自哪里或储存在哪里?因害怕摆渡不给显示分白扔, 小明要测一个玻璃瓶的密度,他手里现在有直尺,烧杯,水,请写出具体步骤 油罐呼吸阀多少钱一只 子弹爆炸我有两颗未爆炸的实弹,在什么情况下会爆炸?很怕有意外 36.现有天平、量筒、水、空瓶、细线、刻度尺、正方体金属块,请在下列仪器中选用合适的器材测出金属块的密实验项目实验方法 选用仪器 所需测得的物理量 密度表达式实验方法一 实验方 油罐呼吸阀里加什么液体啊 “拆下轴承,浸在柴油或汽油中彻底清洗后,再用干净汽油清洗一遍,要注意哪些问题 为了测量金属块的密度现有器材天平,量筒,水,金属块,细线 还差什么?有砝码 但是已经有量筒了 可以测出体积了 干嘛需要烧杯 储存汽油和柴油的储存油罐怎么辨别油罐的质量,是否合格不泄油? 能用汽油洗轴承吗?我的悠悠球是天马神弓,正想洗洗轴承(因为睡眠时间才30秒)我一个朋友说可以用汽油来洗轴承的。我想知道的有以下几点。1、可以用汽油洗轴承吗?2、洗了以后会生 实验室有如下器材:水、烧杯、量筒、天平、细线、小金属块、橡皮筋.选用上述器材可以测量小金属块密度.小丽同学的测量步骤是:①在量筒中倒入适量的水,体积为V 1;②把金属块浸没在 汽油密度,柴油密度,原油密度有相应的国家规定吗?不同标号汽油,不同号的柴油, 悠悠球可以用汽油洗轴承吗?怎么洗?雪鳞锋洗了有什么好处 测量一种矿石的密度.现有器材小矿石块;天平【含砝码】;一个烧杯;足量的水;细线量筒是两种,还要比较可操作性或误差 在柴油库里面打电话,会不会发生爆炸.听说打电话会产生静电,油库容易着火,我们的是柴油库 汽油比柴油更容易着燃,为什么汽油机还需要点火? 测土豆密度.材料有一个弹簧测力计一团细线一把厘米刻度尺和菜刀1写出该实验步骤2土豆密度的计算公式3讨论:在密度的测定实践中,影响测定的主要因素有哪些? 静电引起燃烧爆炸的条件是什么? 柴油冻结是什么原因? 如和用量筒.刻度尺.小 刀.水桶.烧杯.水测土豆的密度 房间里突然爆炸,所有设备正常,只有静电爆炸的可能,请问什么能引起静电爆炸? 怎么分辨柴油型号有没有什么测量仪器?请各位高手给予解答!万分着急 谢谢了 用弹簧测力计,一团细线,一把厘米刻度尺和菜刀怎样测出土豆的密度谢谢 氧气有一定的压力,在有静电的情况下会爆炸吗.氧压机不漏油.阀门之间没有装防静电的东西.放空阀是开着的.准备去开出口阀时发生了爆炸.现场阀门烧的变形.他按照正常的操作开的.我同事 不同型号的柴油能不能混合使用 现有天平(含砝码)、量筒、烧杯、足量的水、小刀、细线和土豆,请从中分别选取适当的器材,设计两种测定现有天平(含砝码)、量筒、烧杯、足量的水、小刀、细线和土豆,请从中分别 一定空间,柴油燃烧为什么会爆炸是不是燃烧的气体无法散去,从而产生膨胀? 在元素周期表里,怎么判断熔沸点高低. 马铃薯的密度 电子油箱里的@怎摸写出来 元素周期表中单质熔沸点变化规律氢化物熔沸点变化规律 用一个弹簧测力计,一团细丝,一把厘米刻度尺和菜刀测土豆的密度.1.写出实验步骤2.土豆密度的计算公式3.在密度的测定实验中,影响测定准确性的主要因素有哪些?好的大大地加分! 汽车中油箱的结构组成是怎样的? 元素周期表中元素单质熔沸点规律.说明白点.
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn