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

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

 

 

腾讯游戏运营管理中心总监刘栖铜:腾讯游戏云的理想与实践 一号专车产品总监曹景辉:LBS应用仍有无限的创新空间 昆仑游戏总裁张益豪:做好中国游戏的海外代理 游族首席运营官陈礼标:重点打造全球化IP 我是怎么利用微信月收入三万以上的! 我的Y Combinator黑客马拉松之感! 最炫HTML5 JavaScript框架Famo.us融资2500万美元 看板先驱David J. Anderson:看板方法拉动互联网时代敏捷变革 《近匠》增强现实开发团队LegendTech:AR技术现已加入15元豪华午餐 微软新技术:简单修改,手机摄像头摇身变3D深度相机 Black Hat USA安全隐患盘点及黑客奥斯卡颁奖 MDCC免费展位报名火热!数量有限,征集进行中 迪游信息科技CEO张晓雷:中日游戏面面观 百余款智能电视创意类应用参赛角逐 Top13 App新鲜出炉! 微信公众平台开发——如何保证access_token长期有效? 拼的就是速度!超快HTML5 2D渲染引擎Pixi.js 一周消息树:百度“涉黄”遭警告,网盘内容审核的四种方式 微信开发商现状调查:接口限制成主要困扰 行业需求多样是最大难点 小米:海外扩张需谨慎,信息安全或成最大掣肘 AMD FX系荣耀归来 或成大众新宠! 脑洞大开:《80天环游地球》同名游戏诞生记 2014微信开发者大会 最后30个参会名额! 林仕鼎创业产品“云校”正式上线:让教育个性化、多元化、均衡化 14岁少年开发者:伍兴云的智能家居“梦” Xcode 6 Beta 6发布闹乌龙,着重改进Swift语言 当API遇到云平台,开发者面临的新抉择! 《近匠》欧朋流量宝,工具类应用开发之道 《近匠》Bmob:免费无限制的公有云服务 MDCC应用征集最新动态:3D手游成热点、硬件种类丰富 闪迪Ultra II SSD:采用TLC闪存,最低价为79.99美元 现有技能不浪费!基于Titanium的跨平台游戏引擎Platino onchange在程序改变当前选项时无法触发? 如何将所绘制图形保留在窗口上? 消息机制??? 请教,如何做一个进度显示?希望(详细点)!拜托高手 一个关于属性页的问题 新手问题:SQL*PLUS出错! 一道调用传递引用的参数,实现两个字符串变量的交换的题目,帮帮忙! 离开 论坛 散分 关于php与frontpage之间的一些问题!! 离开 论坛 散分【二】 在ASP中生成SURFER对象时出现错误 离开 论坛 散分【三】 离开 论坛 散分【三】 急救! 如何操作磁卡读写器 Help,如何更改DataGrid控件选中那个单元格的背景色和前景色? 2000共享文件问题,请高手看一下,很古怪的! 朋友,你好! 离开 论坛 散分【四】 高手救命,简单数据库规划问题!!!价值50分!!! 想听听大家对 static 命名的函数、变量的用法 Access数据库传到服务器后,变为只读了?求助,白思不得其解 请问怎样取得PCM流 离开 论坛 散分【五】 打包,解包??? 离开 论坛 散分【六】 离开 论坛 散分【七】 求教SQL语句,高手、或刚入门的同道都进来讨论一哈 最初linux使用什么编译开发的? 离开 论坛 散分【八】 关于字符串截取问题 谁有FASTREPORT的注册版本 我急用!在线等待!谢谢! 离开 论坛 散分【九】 Application.messagebox和messagebox有什么区别呢? 水晶报表的两个小问题? 怎样向Foxpro表中添加float型数据? 离开 论坛 散分【十】 问一个和Session有关的问题,达人请进 在宏里把ie关闭。非常感谢 如何让window.showModalDialog的page提交数据到原来的父页面? 合租住房!! 有没有一个命令直接解开iso文件或提取里面的一个文件或文件夹 请给看看程序:AVI视频的读取和重建 如何显示出电脑内已经注册的dll文件列表? 中程浮点数问题! solaris下CC编译器的问题? UML的书籍和软件? 那里有vs.net2003的vss6.0d版本? 有时候exe文件不能运行? 自己准备写一个工资发放和发布的程序,欢迎探讨. 襄儿妹妹还在吗?幸好偶这个马甲还有点分,全给你吧,这个ID密码她不知道呵呵~~~ 没有责任心的男人是男人吗拜托各位大神 有的男人为什么那么没有责任心呢?为什么有的男人会没有责任感呢. 我们吃的橘子属于什么,剥下去的皮,主要由什么组织构成,橘子和橘瓣之间白丝属于什么组织 不需任何机器,怎样剥桔子皮剥的快些? 早教中的3S 理论是什么呀? 燃素说 是由谁在哪年最早提出的 关于x的不等式x^2+mx+4≥0对一切x∈(1,2)都成立哪里错了吗?有人说 有定义域的不能用△.为什么? 为什么沙漠里会有河?沙漠里的河不会干的吗?为什么海边也有沙漠,不是有海水吗? 无纺布在绿化中有哪些应用 几道初2一次函数题6点前要答案(1)已知一次函数Y=2X+8 如果3小于X小于等于5,求Y的取值范围(2)一次函数Y=-3X+B的图像经过反比例函数Y=3/X的图象上一点,且这点的横坐标为-1,求图象与X轴Y轴所围成 法律规定失踪几年可以到法院申请其宣布死亡? 韩国附近海域沉船事故一名中国籍船员遗俄否认G20礼品中安窃听器 称报道意埃及穆兄会二把手被捕 穆尔西等高层将美媒:美国难以在国际舞台既当演员又做菲人质事件在港谈判分歧收窄 同意继续泰部署5000警察应对民主党发起反特韩国海域沉船事故一失踪中国籍船员遗体记者手记:罗汉松——日本苗木之乡的摇中国帮助我们圆了“公路梦”格外交部:俄未被列入总统就职典礼受邀泰部署5000警察应对民主党发起反特张超超:深化国资国企改革 重点领域尽德州婆媳因琐事闹别扭 婆婆负气抱2岁福州多名市民ATM交易时 遭遇假冒银杭州推出“西湖联票” 持票可畅游核心马尾3名小偷盗电动车打伤村民 群众与福建放开部分专业服务收费标准 涉及1福建16个传统村落获2014年首批中中国石化首个微生物驱油区块增油14万姜异康郭树清分别与美国驻华大使博卡斯济南监控实拍骑电动车碰瓷 警方支三大淄博一快递公司深夜起火 疑电动车充电
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘