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

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

 

 

又一次跨越:著名3D游戏引擎Unity版本更新 Feedly团队:自研后端平台或将开源 StackMob的诱惑:16小时,山寨一款移动App “云”筹帷幄 开发者必知的5大SaaS在线服务工具 超350个政府项目托管在GitHub 政府开源会成主流? Kinect for Windows SDK 1.7正式发布,支持3D建模 SafeNet与风河系统联手推出VxWorks嵌入式系统软件货币化方案 Windows Server 2012中的动态负载均衡 Google等互联网公司将成为创新中心? 在Hadoop的战争中 MapR获新一轮3000万美元融资 初创公司DNNresearch:谷歌科技帝国的新“基石” 创业了,我们该如何起名? 乐视网联手富士康推新盒子C1S “0+290元”新浪微博发售 吸引开发者:只要开发新应用 微软便奖100美元 PaintCode - 将矢量图转化为Objective-C代码的开发神器 苹果发布iOS 6.1.3 封杀evasi0n越狱所用漏洞 [API快讯] Google开放实时协作API 58同城开源轻量级Java Web框架 Argo 初创公司AppNeta:4轮融资,4780万美元 MongoDB释放2.4版本:692更新及8大得意之作 十年6亿美元!Amazon云计算喜获CIA大单! 国人当自强:HTML5+联盟首次筹备会成功举行 开源框架TAAE发布 快速打造iOS音频应用 如何学会600多种编程语言 “第五届中国云计算大会”将于2013年6月5-7日在京召开 Ridiculous Fishing:游戏遭遇山寨如何一雪前耻 老游戏的今天:Doodle Jump每周进账2万美元 剑指Evernote 谷歌正式推出Google Keep 开源的JS MVC框架 Backbone.js 1.0发布 前Facebook资深员工王淮给技术创业团队的十点建议 微软发布Windows Embedded 8系列操作系统 在CXXXApp里如何调用CXXXDoc里的变量? 关于ADO对象的用法? .x文件中animation set中的rotation是弧度,还是? [php版]公告:关于删除 IShellFolder 发贴的通知! 有了seq server基础,想深入学习一下,改怎么做? 请问高手,有关数据导入导出的问题! 高分求《VC技术内幕》第5版 求源码!!!!!! 出大问题了 notes designer的问题(在线等候.....)急!! 关于csdn上的网络道德问题!大家的网络需要大家共同来支持!(每一个真正的程序员都应来声援!) 高分回报:一条简单的SQL语句写法,谢谢各位大侠, asp中寫Response.cookies ("ITEM1")("SUBA")="Standy"在dotnet(C#)中如何讀出 在局域网内。知道一个机器的IP地址。如果获取这台机器的名字 带外数据具体有何用途?(在线等) 加了一个三角,高兴,散分! 请问一个三位重构的问题,哪里有这羊的的示例程序? 显卡显示有阴影??? 有挑战性的翻译,请翻译下列C++名词,并请举例说明 麻烦大哥们看看!关于wab应用中在datagrid中取值的问题 如何实现CSDN这样回答问题的效果? 初级问题,请各位大侠帮忙! 数据结构中关于二叉排序树的生成问题 请教高手:如何在一区域找到找到指定颜色的点?? 一个关于窗口的问题 如何在数据窗口实现编辑、修改等后的撤消、复制、粘贴、剪切功能! exec,sp_executesql语句,中字符串变量的问题 急~~~~(请赐教)! window.showModaldialog()问题 关于Internet Explorer不能打开链接的问题 求助 求购:中国地质大学(京)网络历年考研题复习资料 Longhorn与WINDOWS2003是何关系? applet的执行顺序问题?? 在数组里找到最大值的函数是什么? 没有监听器? VB .NET能用于AutoCAD开发吗? 如何用OnMouseWheel实现Image的放大缩小? 装了Media Player 9.0,怎么没声音? 如何将DataSet中的数据全部写入数据库? 简单问题(关于光标移动) 一个关于java的小问题要请教? 请问delphi中有二~十进制的转换函数吗..... 关于不同页面调用的问题,谢谢 can't open the file"cos.obj" 这里到底怎么了?有人“非典”发作了? 关于STL的问题: dreamwearver mx如何预览asp.net的一些控件>? 关于日期格式的问题 如何使自己的程序访问别的程序的内容? 很初级的问题. 关于DB2的培训资料或者ppt 初学JAVA希望大家介绍点好书,有分的哦~~~~~~~~~~ 那是什么玩具?原理是什么?前段时间看到小孩玩的玩艺儿,是一种塑料包装的,不大,上面煞有介事的全是英文,我想也就是些三无产品.玩的时候就只接用力击打塑料袋,或者只接用脚跺一下,塑料 一道矩阵计算题这道题硬算肯定是不行的,谁能给出答案和相应的思路就行了.只要使我最先理解这道题的,便列为最佳答案 下列现象不属于旋转的是A.摩托车急刹车时向前滑动B.汽车在运动过程中车轮的转动 C.拧开自来水龙头的过程 D.钟表上时针的匀速运动 以下名言是谁说的1草堂留后世,诗圣著千秋.2 两表酬三顾,一对足千秋 3 犹留正气参天地,永剩丹照古今.4千古诗才,蓬莱文章建安骨.一身傲骨,青莲居士谪仙人.5写鬼写妖高人一等,刺贪刺虐入骨 在做一道加法计算题时,把个位上的4看作7,十位上的8看作2,结果是306,正确的答案是多少27在哪来的?3 60在哪来的? 作业的拼音怎么拼 为倡导和白开水拟一条公益广告 赵阳在做一道加法计算题,把个位上的4看成了7,十位上的8看成了2,结果和是306.正确的答案是多少 "写作业"英语如何拼写? 应用题: 一根铁丝用去25米,是乘下的3倍少5米,这根铁丝还乘多少米? 某公司装修需要A型板材240块,B型板材180块.A型板材规格是60cm×30cm,B型板材规格是40cm×30cm.现在只能购得规格是150cm×30cm的标准板材.一张标准板材尽可能多地裁出A型、B型板材,共有下列三种裁法 图书室有一个两层书架,上层放的书史下层的2.5倍,如果从上层取出本放入下层,则两层的书的本数相等,上下层原来各有多少本书?用方程式计算 一捆铁丝用去了全长的一半多5米,这时还剩25米,这捆铁丝原来长多少米? 初二函数题,注意格式!1.已知y+2与x-1成正比例,且x=3时y=4.(1)求y与x之间的函数关系式;(2)当y=1时,求x的值.2.已知正比例函数y=k1 x的图像与y=k2 x-9的图像交于点p(3,-6).(1)求k1 蚊子在生物链里怎么画,蚊子和人的关系是什么?3Q 一捆铁丝用去了全长的一半多5米,这时还剩25米,这捆铁丝原来长多少米? 一道初二函数题,要写过程,注意格式!一次函数图像经过点(1,3),且平行直线y= -2x+1,求其解析式.要仔细写的过程. The professor and writer is invited to many universities to deliver lectures.为什么要用is而不用are? 超越离合器的旋转方向为什么是逆时针? 18世纪到现在有哪些生物已经灭绝了? 计算题-矩阵求解设A=『0 3 3 1 1 0 -1 2 3 』 若B满足AB=A+2B求B. 请问租赁的“租”和“赁”各是什么意思? 推荐一款高端大气上档次的便宜车! 保护鸟类的公益广告自少点 赁屋是什么意思? 豪车配置一定要高端大气上档次一个朋友买了一款进口车,想给车做个贴膜,让我帮忙问问,贴膜质量一定要好,贵点没有关系,能不能推荐下? 一根铁丝长12米,用去3/4米,还剩多少米? "凭"与"赁"的意思 物体在一条直线上运动,且在任意相等的时间间隔内的位移相等,这种运动称为匀速直线运动想问里面的位移相等咋理解,是位移的大小相等,还是位移矢量的相等啊?谢了! 小马虎在做一道加法题时把一个加数个位上3看成8把 工赁什么意思 求各位大哥大姐 矩阵代数计算题0 -1 -3 2 5A-{-2 -2 -7},B-{0 1},-3 -4 -8 -3 01是3的阶单位矩阵,求(1-A)负4平方 B. This is____ only expensive dress I've gotA.a B.an C.the D.不填.选那个.为什么.有没有固定搭配 借赁的含义 拟一则保护野生动物的公益广告,至少运用一种修辞手法,不超过十五个字. 《詹天佑》一文写了( )的詹天佑^ 世界闻名的自由女神像的实际高度是46米,底座高47米.世界公园里的自由女神像及其底座模型是按1比10比例建造的,这座模型连底座共有多高? 保护野生动物的公益广告至少两条,越多越好! 幼儿园作业题目什么是二次分类板 37詹天佑杰出在哪 两道矩阵的计算题9、设A为三阶方阵,且|A|=3,求|(0.25A)^(-1)-2A*|^(-1)代表逆矩阵,因格式问题无法正常显示.10、设方阵A满足A^2+2A-5E=0,求(A+3E)^(-1) 滚动的足球的质点在哪里 无刷直流电机有位置传感器和无位置传感器区别 为保护野生动物拟条公益广告 请以“珍爱生命,保护动物”为主题,创造几条(两条以上)公益广告,每条不超过15个字 无位置传感器无刷直流电机的专用芯片有哪些?我要用单片机来控制,设计一个无刷直流电机的控制系统.麻烦知道的各位大侠帮帮忙~ 一根铁丝用去他的3/4后还剩下1/5米,这跟铁丝原长多少米? 赁 这个字的读音是什么 要拼音 什么是电调?电调和无位置传感器无刷直流电机有什么关系? 小丽在做一道加法计算题时,把个位上的4看做7.十位上的8看做2,结果和是306,正确答案是多少? 谁可以帮下忙? 这个玩具的原理是什么 矩阵计算题|1 0 -2| |6 3|设矩阵 A=|1 -2 0 | ,B=|1 2|,计算(AB)^-1次方.|4 1|设矩阵 |1 0 -2| |6 3|A=|1 -2 0 | B=|1 2|,计算(AB)^-1次方。|4 1| 幼儿园作业(试验).额,这么说的,放一盆,接满水,分别放入石子、牙膏皮、橡皮泥、空药丸盒、泡沫板、塑料吸管.会发生什么反应.比如石子下沉,泡沫板漂浮等.列出都会发生什么现象,比如下 仿照例句 拟一则宣传保护鸟类的公益广告请仿照下列例句,拟一则宣传保护鸟类的公益广告.(不超过20个字)示例:虽为毫末技艺,都是顶上功夫.(理发店广告) 小明在做一道加法计算题,把个位上的4看作7,十位是的8看作2,结果和是306.正确的要有过程! 幼儿园学前班作业6的组成,是几加几等于六,还是什么? 这是什么玩具,什么原理 小明在做一道加法计算题时,把个位上的4看做7,十位上的8看做2,结果和是306.正确的答案应是多少?坐等审核. 下列几种现象,只属于旋转的有( )①直升机起飞后螺旋桨的运动;②发电的风车的运动;③在笔直轨道上运行的列车;④传送带上的机器零件.A.0种 B.1种 C.3 种 D.4种请说明是哪几个,并讲清 西方盟友会不会因“监听”散伙?美国监听丑闻变“质”环保部:上半年新疆青海等省区氨氮排放人社部:正研究办法治理公职人员“吃空亚冠决赛今夜首战 恒大优势大或破\"媒体称广州公务员年收入超17万 不少女子超市门口产下龙凤胎续:其亲人已经杭州一头藏獒蹿出工地咬伤小区保洁员欧洲盟友讨伐美国的“监听战争”俄“质子”火箭搭载美国通讯卫星升空诺奖得主:转基因之争需要一场高质量的地球变暖事实确凿 人类活动是主因美国对中国等七国钢铁产品发起贸易救济杭州国内经济合作洽谈会引资超155亿十对新人昨天在杭州运河边富义仓拜天地上海浦东一居民被物业劝离后死亡 官方教育部专家谈高考改革:自主招生或将进美国承认窃听事件对美国与伙伴国关系造美国决定对中国输美钢材发起“双反”调美电视台脱口秀节目“杀中国人言论”被阿尔及利亚军队在边境地区查获大批武器【南京观众招募】万有青年烩NO.45刚分手你就……离开小冥的新视野号,已如果世上真有属于你的“唯一注定的真爱变形金刚VS高达,机器人技术到底哪家小心那个走路还在玩手机的人,ta就是三文鱼,刺身界炙手可热的超级网红你是哪个牌子的死忠粉吗?其实你忠诚的都听过“豺狼虎豹”,可你知道豺长啥样防蚊方法大全:怀了孩子有了娃,对付蚊充电器是如何给手机充电的?伊朗决意增产,原油空头将崛起?原油多在自己的阳台上,养一个小菜园安徽高考生家长冒雨抢头香拜“神树”每一篇10w+都不是偶然,标题一定有多图 | 美国队长到底是个什么样的人关于APP开发与未来小型化_更多摄像关于佳能产品未来战略_更多摄像技术惊不再中国独占 三星A9高配版将登陆海雷军称“飞猪”理论是受《孙子兵法》启原来所有来中国的韩国欧巴都被这三个姐中国一纸协议强心针搬扎在委内瑞拉的石
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘