架构深渊

慢慢走进程序的深渊……关注领域驱动设计、测试驱动开发、设计模式、企业应用架构模式……积累技术细节,以设计架构为宗。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

[转]将List对象列表转换成JSON格式的类

Posted on 2009-04-06 03:27  chen eric  阅读(5366)  评论(0编辑  收藏  举报

 

将List对象列表转换成JSON格式的类
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

[copy to clipboard]

1 //
2 // ObjectListToJSON
3 // Copyright (c) 2008 pcode. All rights reserved.
4 //
5 //  Author(s):
6 //
7 //      pcode,[email]jy@cjlu.edu.cn[/email]
8 //  此类用于将List<object>转换为json数据格式
9 //  目前仅能处理一个object的基础数据类型而且对[ { }] \等对json有伤害影响特殊符号没有特殊处理
10 //  希望有兄弟继续完善
11 
12 using System.Reflection;
13 using System.Collections.Generic;
14 
15 public class ObjectListToJSON
16 {
17    #region 反射一个对象所有属性和属性值和将一个对象的反射结果封装成jsons格式
18    /**
19          * 对象的全部属性和属性值。用于填写json的{}内数据
20          * 生成后的格式类似
21          * "属性1":"属性值"
22          * 将这些属性名和属性值写入字符串列表返回
23          * 
*/
24    private List<string> GetObjectProperty(object o)
25    {
26        List<string> propertyslist = new List<string>();
27        PropertyInfo[] propertys = o.GetType().GetProperties();
28        foreach (PropertyInfo p in propertys)
29        {
30            propertyslist.Add("\"" + p.Name.ToString() + "\":\"" + p.GetValue(o, null) + "\"");
31        }
32        return propertyslist;
33    }
34    /**
35      * 将一个对象的所有属性和属性值按json的格式要求输入为一个封装后的结果。
36      *
37      * 返回值类似{"属性1":"属性1值","属性2":"属性2值","属性3":"属性3值"}
38      * 
39      * 
*/
40    private string OneObjectToJSON(object o)
41    {
42        string result = "{";
43        List<string> ls_propertys = new List<string>();
44        ls_propertys = GetObjectProperty(o);
45        foreach (string str_property in ls_propertys)
46        {
47            if (result.Equals("{"))
48            {
49                result = result + str_property;
50            }
51            else
52            {
53                result = result + "," + str_property + "";
54            }
55        }
56        return result + "}";
57    }
58    #endregion
59    /**
60          * 把对象列表转换成json串
61          * 
*/
62    public string toJSON(List<object> objlist)
63    {//覆写,给懒人一个不写classname的机会
64        return toJSON(objlist, string.Empty);
65    }
66    public string toJSON(List<object> objlist, string classname)
67    {
68        string result = "{";
69        if (classname.Equals(string.Empty))//如果没有给定类的名称,那么自做聪明地安一个
70        {
71            object o = objlist[0]
72            classname = o.GetType().ToString();
73        }
74        result += "\"" + classname + "\":[";
75        bool firstline = true;//处理第一行前面不加","号
76        foreach (object oo in objlist)
77        {
78            if (!firstline)
79            {
80                result = result + "," + OneObjectToJSON(oo);
81            }
82            else
83            {
84                result = result + OneObjectToJSON(oo) + "";
85                firstline = false;
86            }
87        }
88        return result + "]}";
89    }
90 
91 }
92




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

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


Code

[copy to clipboard]

namespace Model
{
    
public class Person
    {
        
public string ID { getset; }
        
public string Name { getset; }
        
public string Sex { getset; }
    }
}




然后建立测试类

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


Code

[copy to clipboard]

using NUnit.Framework;
using System.Collections.Generic;
namespace JSon
{
    [TestFixture]
    
public class TestObjectToJSON
    {
        [Test]
        
public void dotest() {
            Model.Person p1 
= new Model.Person();
            p1.ID 
= "1";
            p1.Name 
= "p1";
            p1.Sex 
= "s1";
            Model.Person p2 
= new Model.Person();
            p2.ID 
= "2";
            p2.Name 
= "p2";
            p2.Sex 
= "s2";

            Model.Person p3 
= new Model.Person();
            p3.ID 
= "3";
            p3.Name 
= "p3";
            p3.Sex 
= "s3";
            List
<object> lp = new List<object>();
            lp.Add(p1);
            lp.Add(p2);
            lp.Add(p3);

            ObjectListToJSON t 
= new ObjectListToJSON();
            
string json = t.toJSON(lp, "persons");
            System.Console.Write(json);
        }
    }
}




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