写 Ajax 程序的时候,经常要和后台服务器进行时实的数据交互,以前用的是自定义的字符串格式,比如用“,”进行间隔(有时也用很长的没有用的字符串进行区分),然后再在 javascript 代码中对其进行分隔后得到字符数组对应索引的值,常常是调试很多遍才能对号入座,后来想到了 JSON 这种可以在 javascrip 中很方便就调用的数据格式,所以萌生了想把后台数据生成 JSON格式的想法。之后,在网上找了半天,说 framework3.5 已经可以把对象的属性/值对转换成 JSON 数据格式,我看了一下,又是安装 framework 又是导包,到时候服务器还不一定能够支持,所以这个方法就放弃了(放弃这个方法的主要原因是,我在服务器的IIS部署 Web网站时候,需要 framework 各个不同的版本,有的服务器能够一下子搞定,有的怎么都搞不定,所以不想在各个 framework 版本之间挣扎)。
这个 ToJSONString() 只是用到了对象实例的 GetType() 和 System.Type 的 GetProperties() 方法
GetProperties() 方法返回 ProtertyInfo 数组,保存的是对象相关的属性和值,(当然还有更多的信息,但对于此处,不是必须的)。
关键代码在 ToJSONString() 方法,希望对有需要的人些许帮助。
/*
* 定义一个测试类
* 所有属性均为私有,但提供公共访问方法 get 和 set
*/
public class UserInfo
{
public UserInfo()
{
}
public UserInfo(string name, int age, string address, string sex)
{
this.Name = name;
this.Age = age;
this.Address = address;
this.Sex = sex;
}
public string like;
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
private int _age;
public int Age
{
get { return _age; }
set { _age = value; }
}
private string _address;
public string Address
{
get { return _address; }
set { _address = value; }
}
private string _sex;
public string Sex
{
get { return _sex; }
set
{
if (value != "女" && value != "男")
{
throw new Exception("性别错误,请在 男/女 中选择一个!");
}
_sex = value;
}
}
/*
* 经测试,公共方法不会在 PropertiesInfo 中
*/
public string getInfo()
{
return "测试公有方法";
}
/*
* 转换成 JSON 字符串之后可以方便在 javascript 访问对象的属性
* 如 UserInfo 有属性 Name
* 在 javascript 中可以用 var obj = eval('(jsonString)'); obj.Name 得到其值
*/
public string ToJSONString()
{
System.Reflection.PropertyInfo[] ps = this.GetType().GetProperties();
string json = "{";
int index = 1;
foreach (System.Reflection.PropertyInfo pi in ps)
{
//Name 为属性名称,GetValue 得到属性值(参数this 为对象本身,null)
string name = pi.Name;
string value = Convert.ToString(pi.GetValue(this, null));
//把 javascript 中的特殊字符转成转义字符
value = value.Replace("\\", "\\\\").Replace("'", "\\'").Replace("\"", "\\\"");
json += name + ":'" + value + "'";
if (index != ps.Length)
{
json += ",";
}
index++;
}
json += "}";
return json;
}
/*
* 经过以上测试,得到结论,只有当属性使用 get 和 set 进行封装了之后,才在 PropertiesInfo 中出现
* 即,经过 get/set 封装之后的私有属性可以放心的使用 PropertiesInfo 进行遍历。
*/
}
//使用 WebPage 进行输出测试
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
UserInfo u = new UserInfo();
u.Age = 25;
u.Name = "吴家龙";
u.Sex = "男";
u.Address = "广州市萝岗经'济开发\"区宝\\石路11号301";
u.like = "不知道";//经测试,如果一个属性定义为公有字段,则在 PropertiesInfo 中没有
UserInfo u1 = new UserInfo("王", 24, "广州市", "女");
Response.Write(u.ToJSONString()+"<br/>");
Response.Write(u1.ToJSONString());
btnOK.Text = u.ToJSONString();
}
}
//页面代码
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>无标题页</title>
<script type="text/javascript" src="jquery-1.3.2.js"></script><%--这里使用了 jquery--%>
<script type="text/javascript">
$(function(){
$("#btnOK").bind("click",function(){
var s = $(this).val();
var o = eval('('+ s +')');
alert(o.Name + " " + o.Address);
alert(o.Address);
});
});
</script>
</head>
<body>
<form id="form1" runat="server" onsubmit="return false;">
asp:Button ID="btnOK" UseSubmitBehavior="false" runat="server" />
</form>
</body>
</html>
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wujialongcn/archive/2009/08/01/4399497.aspx