json的官方主页是http://www.cnblogs.com/losingrose/admin/www.json.org。
在其官网上同样也是有着其介绍,很巧,其官网有中文页面http://www.json.org/json-zh.html,这样大家就更容易了解它了。
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。按我的理解,它的实质是利用了javascript中的数组,哈希表和变量弱类型化的特点,创造的无限级复合数据结构。 我们大可不必去探究其本质,总之我们用起来很简单就是了。
json数据在js中可以很方便的调用,如下面的例子:
var myJSONObject = {"bindings": [
{"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"},
{"ircEvent": "PRIVMSG", "method": "deleteURI", "regex": "^delete.*"},
{"ircEvent": "PRIVMSG", "method": "randomURI", "regex": "^random.*"}
]
};
上面的示例,创建了一个包括单独成员”bindings”的对象,此成员包括一个含有三个对象(”ircEvent”, “method”, 与 “regex”)的数组
成员可以通过.或者下标操作符检索。
myJSONObject.bindings[0].method // "newURI"
既然使用json方便我们在客户端存储和操作数据,那么我们如何把数据库中的表转换成这种类型的数据呢?
接下来要介绍官方主页下面的东西了,注意到“空白可以加入到任何符号之间。 以下描述了完整的语言。”这句下面有一条黑线吗?
之后罗列了很多语言,这些是什么呢?
他们是json在各种语言中的应用链接,让我们看C#下面列的项,我个人选择的是Json.NET - LINQ to
JSON不仅是因为其名称显得功能强,你点开看就会发现他的博客以及文档工作做得都相对较好,而且类库打包的也比较好,还有源码下载。
我用的就是他的源码,我选择的是2.0的版本http://www.codeplex.com/Json/Release/ProjectReleases.aspx?ReleaseId=13099,然后又增加了两个函数以适应自己的需求加入的几个函数如下:
Code
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
namespace Newtonsoft.Json
{
public class DatatableToJson
{
/**//// <summary>
/// js安全转换
/// </summary>
/// <param name="str">源字符</param>
/// <returns>返回代码</returns>
public static string StrSafe(string str)
{
StringBuilder rd = new StringBuilder(str);
rd.Replace("\b", "\\b");
rd.Replace("\f", "\\f");
rd.Replace("\n", "\\n");
rd.Replace("\r", "\\r");
rd.Replace("\t", "\\t");
rd.Replace("\'", "\\'");
rd.Replace("\"", "\\\"");
return rd.ToString();
}
public static string JSON_DataTable(DataTable dt)
{
string tablename = dt.TableName;
if (tablename == "")
tablename = "Table";
StringBuilder JsonString = new StringBuilder();
JsonString.Append("{ ");
JsonString.Append("\"" + tablename + "\":[{ ");
JsonString.Append("\"Rows\":[ ");
for (int i = 0; i < dt.Rows.Count; i++)
{
JsonString.Append("{ ");
JsonString.Append("\"Column\":[ ");
for (int j = 0; j < dt.Columns.Count; j++)
{
if (j < dt.Columns.Count - 1)
{
JsonString.Append("{" + "\"Data\":\"" + StrSafe(dt.Rows[i][j].ToString()) + "\"},");
}
else if (j == dt.Columns.Count - 1)
{
JsonString.Append("{" + "\"Data\":\"" + StrSafe(dt.Rows[i][j].ToString()) + "\"}");
}
}
/**//*end Of String*/
if (i == dt.Rows.Count - 1)
{
JsonString.Append("]} ");
}
else
{
JsonString.Append("]}, ");
}
}
JsonString.Append("]}]}");
return JsonString.ToString();
}
public static string JSON_DataTables(params DataTable[] dts)
{
int tableid = 1;
StringBuilder JsonString = new StringBuilder();
JsonString.Append("{");
foreach (DataTable dt in dts)
{
if (tableid > 1)
JsonString.Append(",");
if (String.IsNullOrEmpty(dt.TableName))
dt.TableName = "Table" + tableid;
JsonString.Append("\"" + dt.TableName + "\":{ ");
JsonString.Append("\"Rows\":[ ");
for (int i = 0; i < dt.Rows.Count; i++)
{
JsonString.Append("{ ");
for (int j = 0; j < dt.Columns.Count; j++)
{
if (j < dt.Columns.Count - 1)
{
JsonString.Append("\"" + dt.Columns[j].ColumnName.ToString() + "\":" + "\"" + StrSafe(dt.Rows[i][j].ToString()) + "\",");
}
else if (j == dt.Columns.Count - 1)
{
JsonString.Append("\"" + dt.Columns[j].ColumnName.ToString() + "\":" + "\"" + StrSafe(dt.Rows[i][j].ToString()) + "\"");
}
}
/**//*end Of String*/
if (i == dt.Rows.Count - 1)
{
JsonString.Append("} ");
}
else
{
JsonString.Append("}, ");
}
}
JsonString.Append("]}");
tableid++;
}
JsonString.Append("}");
return JsonString.ToString();
}
public static string CreateJsonParameters(DataTable dt)
{
StringBuilder JsonString = new StringBuilder();
//Exception Handling
if (dt != null && dt.Rows.Count > 0)
{
JsonString.Append("{ ");
JsonString.Append("\"Rows\":[ ");
for (int i = 0; i < dt.Rows.Count; i++)
{
JsonString.Append("{ ");
for (int j = 0; j < dt.Columns.Count; j++)
{
if (j < dt.Columns.Count - 1)
{
JsonString.Append("\"" + dt.Columns[j].ColumnName.ToString() + "\":" + "\"" + StrSafe(dt.Rows[i][j].ToString()) + "\",");
}
else if (j == dt.Columns.Count - 1)
{
JsonString.Append("\"" + dt.Columns[j].ColumnName.ToString() + "\":" + "\"" + StrSafe(dt.Rows[i][j].ToString()) + "\"");
}
}
/**//*end Of String*/
if (i == dt.Rows.Count - 1)
{
JsonString.Append("} ");
}
else
{
JsonString.Append("}, ");
}
}
JsonString.Append("]}");
return JsonString.ToString();
}
else
{
return null;
}
}
}
}
这两个函数可以直接将datatable转换成字段名对应的json的。
到此我们就完成了服务器端数据的转换部分,那么使用什么方法把这些数据传输到客户端最好呢?
当然你可以在页面直接输出,也可以使用庞大的传统的web服务(不过使用json其实就是为了不使用web服务),不过这两种都不是最优化的,我选择了ashx一般处理程序,根据我查阅网络资料知道了他的处理性能比aspx都要高10倍以上,于是我就选择了它。
具体内容参考 结合jquery,json很好地利用ashx文件开发高性能ajax一文。
客户端就采用的是jquery的ajax方法来相互之间传递数据,具体请看jquery的api自己尝试下吧。
相关链接:结合jquery,json,jst很好地利用ashx文件开发高性能ajax,2009年4月1日增加Demo下载