设为首页 收藏本站
查看: 1343|回复: 0

[经验分享] ASP.NET用SQL Server中的数据来生成JSON字符串

[复制链接]

尚未签到

发表于 2015-7-1 12:55:26 | 显示全部楼层 |阅读模式
  最近在学习ExtJs与ASP.NET结合开发,前者用到的数据内容基本上都是JSON格式,遂想写一个格式化数据成JSON的东东,在网上找了一下,发现还蛮多的,实现了一个类似于ToString()的方法,名曰:ToJson()。
  不过在网上看到的基本上都是属于SCOTT大作的临摹版,90%以上都一样(我并不是说SCOTT大虾的杰作有什么不好,没有那个意思),于是我也照着葫芦画了一个瓢。废话就不多说了,直接进入正题。
  先说说我的开发环境:

  • Windows Server 2008 DataCenter
  • Visual Studio 2008 Team System
  • SQL Server 2005 Developer(SQL 2008已经正式发布了,准备升级,^_^)
  我照着SCOTT的大作(本文末有原著以及中文版链接)写了一个ToJson()出来。代码如下:

DSC0000.gif DSC0001.gif SCOTT大作源码
1 DSC0002.gif using System;
2using System.Web.Script.Serialization;
3
4namespace Demo
5 DSC0003.gif {
6 DSC0004.gif DSC0005.gif     /**////
7 DSC0006.gif     /// JSON帮助类
8 DSC0007.gif     ///
9    public static class JsonHelper
10    {
11        /**////
12        /// 格式化成Json字符串
13        ///
14        /// 需要格式化的对象
15        /// Json字符串
16        public static string ToJson(this object obj)
17        {
18            JavaScriptSerializer serializer = new JavaScriptSerializer();
19            return serializer.Serialize(obj);
20        }
21
22        /**////
23        /// 格式化成Json字符串
24        ///
25        /// 需要格式化的对象
26        /// 指定序列化的深度
27        /// Json字符串
28        public static string ToJson(this object obj, int recursionDepth)
29        {
30            JavaScriptSerializer serializer = new JavaScriptSerializer();
31            serializer.RecursionLimit = recursionDepth;
32            return serializer.Serialize(obj);
33        }
34    }
35 DSC0008.gif }  一字不漏的照打,应该没有问题吧(后来发现SCOTT大作末尾的Note,忘记看了,真是粗心啊~~~ *_*)!
  但是在编辑的时候,虽然是成功了,但是发现有2个警告,由于本人写程序一直都是尽自己最大努力来保证所写程序的警告数量最少,所以,当然要看看这两个警告到底是什么东东。
  警告是:“System.Web.Script.Serialization.JavaScriptSerializer.JavaScriptSerializer()”已过时:“The recommended alternative is System.Runtime.Serialization.DataContractJsonSerializer.”
  记得刚开始学习ASP.NET的时候,在用AppSettings的时候(具体哪个方法记不清了)也出现过类似的警告,最后是用ConfigurationManager代替就没有出现过该警告了,那这次应该也差不多吧。
  于是到MSDN看看是怎么回事。没弄明白,再到CSDN看看呢。还是没弄明白,最后,求助一下Google。NND,折腾了半天,还是不知道到底是什么回事。
  用“DataContractJsonSerializer”来代替吧,但是又少了对“System.Runtime.Serialization”的引用,把引用添加上吧,还是没有编译通过。
  一直不知道是怎么回事,最后,幸运的Google到一个Demo,也是用“DataContractJsonSerializer”来代替上诉过时警告的。SCOTT大作中末尾Note给出的链接。
  总算是明白怎么回事了。解决步骤如下:
  首先,添加两个DLL的引用,分别是:System.Runtime.Serialization.dll、System.ServiceModel.Web.dll。
  添加完引用之后,在cs代码页中添加using语句,如下:

添加命名空间
1using System;
2using System.IO;
3using System.Runtime.Serialization.Json;  
  注:因为要用到Stream等东东,所以这里要添加上System.IO这个命名空间。
  总共三条using语句,在添加完之后,就可以开始写代码了,代码如下:

将数据格式化成JSON
1namespace Demo
2{
3    /**////
4    /// JSON帮助类
5    ///
6    public static class JsonHelper
7    {
8        /**////
9        /// 格式化成Json字符串
10        ///
11        /// 需要格式化的对象
12        /// Json字符串
13        public static string ToJson(this object obj)
14        {
15            // 首先,当然是JSON序列化
16            DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
17
18            // 定义一个stream用来存发序列化之后的内容
19            Stream stream = new MemoryStream();
20            serializer.WriteObject(stream, obj);
21
22            // 从头到尾将stream读取成一个字符串形式的数据,并且返回
23            stream.Position = 0;
24            StreamReader streamReader = new StreamReader(stream);
25            return streamReader.ReadToEnd();
26        }
27    }
28}  到此,该类的编写就完成了,剩下的就是调用了。
  首先在Visual Studio 2008中新建一个库类项目(名称任意),将上述的内容添加到该项目中去,编译成一个dll文件供WebApplication(或WebSite)调用。我这里建的工程叫做Demo,编译出来的dll叫做Demo.dll。
  然后在SQL Server 2005中新建一个数据库,在Web.config中配置好链接字符串,反正可以读取数据就行,这里就不再详述了。我这里建的数据库叫做Test,表名为Test_Table_01,字段有:TestID(int),Title(varchar(50)),Body(varchar(200)),Remark(varchar(200)),字段内添加了一些内容。
  在Visual Studio 2008中新建一个WebApplication(也可以是WebSite),然后添加上述Demo.dll的引用,别慌,还需要添加“System.Runtime.Serialization”的引用,因为在后面添加实体层的时候,需要对实体层的属性进行序列化。我这里新建的是WebApplication,名称叫做Test。
  然后在Test中添加了App_Code文件夹,在里面添加了一个类,叫做TestClass.cs。
  该类就用于映射数据库Test中的表Test_Table_01,添加好cs文件之后,写入如下代码(C# 3.5的新特性^_^):

TestClass实体层
1using System;
2using System.Runtime.Serialization;
3
4namespace Test
5{
6    [DataContract]
7    public class TestClass
8    {
9        [DataMember]
10        public int TestID { get; set; }
11        [DataMember]
12        public string Title { get; set; }
13        [DataMember]
14        public string Body { get; set; }
15        [DataMember]
16        public string Remark { get; set; }
17    }
18}  注:如果要对该类进行序列化,一定要在类前面添加上“[DataContract]”,在属性前面添加上“[DataMember]”,这样才能被“DataContractJsonSerializer”序列化成JSON。
  在添加好TestClass.cs文件之后,在根目录新建一个Default.aspx页面,在页面中放一个Label,转到后台代码。
  在cs代码上面添加“using Demo;”、“using System.Collections.Generic;”和“using System.Data.SqlClient;”这三条using语句。
  然后新建一个方法,用于获取数据库中的数据,并且将获取出来的内容填入泛型中(这里给出的代码中,DataAccess是我自己根据SqlHelper重写的一个数据库访问类,其实直接用SqlHelper就可以了),代码如下:

获取数据库中数据,并添加到泛型中
1// 获取表中的所有数据
2private List GetAllData()
3{
4    List list = new List();
5    string strSql = "SELECT * FROM Test_Table_01";
6    SqlCommand cmd = new SqlCommand(strSql);
7    DataAccess da = new DataAccess();
8    try
9    {
10        SqlDataReader sdr = da.ExecuteReader(cmd);
11        while (sdr.Read())
12        {
13            list.Add(this.FillDetailWithReader(sdr));
14        }
15    }
16    finally
17    {
18        da.DisConnect();
19    }
20    return list;
21}
22
23// 向泛型填充数据
24private TestClass FillDetailWithReader(SqlDataReader reader)
25{
26    TestClass model = new TestClass();
27    if (reader["TestID"] != DBNull.Value)
28        model.TestID = (int)reader["TestID"];
29    if (reader["Title"] != DBNull.Value)
30        model.Title = (string)reader["Title"];
31    if (reader["Body"] != DBNull.Value)
32        model.Body = (string)reader["Body"];
33    if (reader["Remark"] != DBNull.Value)
34        model.Remark = (string)reader["Remark"];
35    return model;
36}  这两个方法写好之后,就可以调用了。在Page_Load事件里面输入以下代码:

Page_Load事件
1protected void Page_Load(object sender, EventArgs e)
2{
3    if (!IsPostBack)
4    {
5        // 首先调用GetAllData()方法获取数据库中的数据
6        List list = this.GetAllData();
7
8        // 将泛型list格式化成JSON字符串,并且赋值到Label1中去
9        Label1.Text = list.ToJson();
10    }
11}  到此,就完成了从SQL Server中读取数据、格式化成JSON字符串、并且输入的过程。
  如今网上有很多这方面的内容,比如什么用LINQ读取啊,或者不用SQL Server,用XML等等,就靠大家自己去摸索的。
  下一步目标:不知道大家注意到没有,上面SCOTT大作里面对ToJson()进行了重载,而我写的ToJson()方法只有一个,少了一个重载,这个就是我的下一步目标,希望是在没有警告的情况下,将序列化深度的自定义研究出来。
  不好意思,自己的基础比较薄弱,在这里献丑了,还望大虾多多谅解。今天敲累了,该睡觉了,下次再研究了套用ExtJs之后,再发上来。
  希望各位身体健看,工作顺利。
  缺水的海豚敬上
  PS.
  SCOTT大作原文(Tip/Trick: Building a ToJSON() Extension Method using .NET 3.5)
  SCOTT大作中文版(技巧/诀窍:用 .NET 3.5 创建 ToJSON() 扩展方法 (木野狐译))

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-82228-1-1.html 上篇帖子: 使用SQL SERVER 2000的全文检索功能 下篇帖子: SharePoint Portal Server 2003(sps)+SQL Server 2005安装手记
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表