随笔- 4  文章- 2  评论- 102 
  2009年3月19日

目标:以C#解析一串类似[{},{},{}]承载着数组数据的json字符串。将其反序列化为一个对象列表

运行环境:

NUnit2.4 C# .net2.0

代码:

 

 1 //======================================================================
 2 //
 3 //        Copyright (C) 2008-2009 PCODE TEAM.  All rights reserved.
 4 //
 5 //        CLR Version: 2.0.50727.1433
 6 //        NameSpace: TestPrj
 7 //        FileName: TestJson
 8 //
 9 //        Created by Jy at  2009-3-19 22:17:15
10 //        Email:jy@cjlu.edu.cn
11 //
12 //======================================================================
13 
14 using System;
15 using System.Collections.Generic;
16 using System.Text;
17 using NUnit.Framework;
18 using Newtonsoft.Json;
19 namespace TestPrj
20 {
21     [TestFixture]
22     public class TestJson
23     {
24 
25         [Test]
26         public void testA()
27         {
28             //测试数据
29             string ojson = "[{SZD:'BM',SGX:'=',SZ:'33'},{SZD:'SJ',SGX:'=',SZ:'3333'},{SZD:'SJ',SGX:'=',SZ:'3333'}]";
30 
31             Newtonsoft.Json.JavaScriptArray jsa = (JavaScriptArray)JavaScriptConvert.DeserializeObject(ojson);
32             IList<searchArgs> li = new List<searchArgs>();
33             for (int i = 0; i < jsa.Count; i++)
34             {
35                 JavaScriptObject jso = (JavaScriptObject)jsa[i];
36                 searchArgs sa = new searchArgs(GetJsonStringValue(jso, "SZD"), GetJsonStringValue(jso, "SGX"), GetJsonStringValue(jso, "SZ"));
37                 li.Add(sa);
38             }
39             System.Console.WriteLine(li.Count);
40         }
41         public class searchArgs {
42             public string SZD { getset; }
43             public string SGX { getset; }
44             public string SZ { getset; }
45             public searchArgs(string szd,string sgx,string sz) {
46                 SZD = szd;
47                 SGX = sgx;
48                 SZ = sz;
49             }
50         }
51         public static string GetJsonStringValue(Newtonsoft.Json.JavaScriptObject jso, string key)
52         {
53             try
54             {
55                 return jso[key] == null ? string.Empty : jso[key].ToString();
56             }
57             catch (Exception e)
58             {
59                 return string.Empty;
60             }
61         }
62     }
63 }

 反序列化后的对象列表为li对象。输出反序列化后li对象中包含的对象个数用于核对。

Bingo!

:)

posted @ 2009-03-19 23:00 源姜 阅读(237) | 评论 (0)编辑
  2008年11月29日
     摘要: 分页,是WEB开发中面对的最常见的编程,实现方法多种多样。我也不来评论这些方法的好坏。但我总感觉它们太复杂,不够清晰不够简单。我十分欣赏PHP中一个Pager.php分页类的算法。http://www.phpclasses.org/browse/file/288.html,作者不详。也在不同的项目中把这种思想转换成不同语言的分页类,你不妨也试试。这种算法的思路是这样的:1、把分页后的数据抽象为一个... 阅读全文
posted @ 2008-11-29 00:06 源姜 阅读(4029) | 评论 (55)编辑
  2008年11月26日

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。引用于[http://www.json.org/json-zh.html]

一般应用中,我习惯性地把结果集以更通用的IList<object>对象列表方式保存(可能会对性能有些影响)来保证类间交互时的通用性,降低函数功能对具体类的耦合。但AJAX调用时,还需要把对象列表转换成JSON数据交给前端显示。有麻烦。

     研究了一下JSON的对象定义和集合定义

 

     感觉利用反射来生成JSON还比较方便。代码如下:

 

Code

 OK,我们建立一个测试来验证一下它是否生效。

先建立一个对象定义person.cs

Code

然后建立测试类

我用了一种非常原始的方法生成了对象列表,其实可以从数据库查询,怕把事情搞得太复杂。呵呵。

Code

跑一下Nuint,我们想要的json串已经生成了。

posted @ 2008-11-26 16:54 源姜 阅读(2401) | 评论 (9)编辑
  2008年11月13日
     摘要: -因本人编程的能力有限,程序肯定仍有很多可以值得修订的地方,请大家多多指教。让它们的对比更公平。我也是初涉入orm这个领域,也参考了不少cnblog上的大侠们的文章,此次对比的两段小程序都没有经过任何优化,都是最简单的应用代码。 因为考虑到优化是一个大课题,针对不同的数据量级和应用环境,每一种ORM产品都有自己更独到的优化方式。Nhibernate有缓存延迟加载,linq to sql 也能做预编... 阅读全文
posted @ 2008-11-13 13:02 源姜 阅读(1523) | 评论 (16)编辑

我写了两段测试程序来验证Linq to Sql 和NHibernate的性能,做了很久的测试,以下是文章的截选。发给大家参考一下,大家多指教。

测试思路:

 

 

同时来编写NHibernateLinq to Sql测试程序,并对比其各模块实现的代码。两个测试程序均按如下方式声明测试类

    [TestFixture]

    public class TestApp

{

      [TestFixtureSetUp]

         初始化函数

      [Test]

         测试函数

      [TestFixtureTearDown]

     卸载函数

………

}

 

数据及测试软件准备

数据存放于SQL SERVER 2005NHibernate版本为2.0,编程环境为VS.net 2008,程序采用NUint2.4.8单元测试工具来直观地获取运行时间(Execution Time),对于考查性能的指标。按照千、万、10万、100万量级递增的数据规模运行时间以秒记,精确到小数点后七位。对于每个测试模块,测试运行3次取后2次运行时间的平均值,尽可能排除数据库对单一应用程序的缓存和语句编译等因素的影响。

操作

ORM

千条数据

万条数据

十万条数据

百万条数据

写入

Linq to SQL

0.7168726

2.9009993

24.7615404

312.4021605

NHiberante

0.3241660

01.8340702

16.8427108

217.5106473

查询

Linq to SQL

0.7700709

0.7906083

1.0457957

4.3646305

NHiberante

0.2678490

0.5244701

3.9022920

43.3711542

更新

Linq to SQL

1.3043570

5.1352840

44.4361433

468.34

NHiberante

0.1090214

4.2710070

38.3539783

401.7142972

删除

Linq to SQL

1.4256575

7.5339277

66.3342046

744.9148032

NHiberante

1.4565611

5.9940426

56.7348532

614.4343719

 

 

 

 

 

 

 

 

 

  

 

注:以上实验数据的测试硬件条件为 Intel Core Duo E4500,2G内存,320G7200转希捷硬盘。对两种产品均未采取任何形式的优化。

  

            结论:

1)、Linq to SqlNHibernate这两种框架产品在批量更新和删除数据时性能表现十分差,与直接用ado.net进行操作在十万和百万数据量级时相差近百倍。虽从事实上,应用ORM类产品批量处理数据库的操作有背于面向对象的设计思想。但也可以使我们了解到,在应用ORM框架的数据库应用系统中应该采取更直接的操作方式解决此类操作的性能问题。

2)、在十万条以内级别操作数据量的应用环境下,Linq to SqlNHibernate都能以可以较好的性能完成数据库操作。这种条件下NHibernate在读、写、更新、删除各项操作中均大幅度领先于微软的Linq to Sql,特别是在万条数据以内这个级别上NHibernate表现出来的性能几乎是Linq to Sql的一倍。操作的数据量越小这种性能的差异越明显。

3)在单次操作十万数据、百万数据级别的数据库应用中,Linq to Sql的查询性能十分强劲,成绩几乎与ado.net直接操作数据库性能吃平。但其它操作性能仍被NHibernate大大领先。

posted @ 2008-11-13 00:06 源姜 阅读(2488) | 评论 (22)编辑