【发布时间】:2009-01-15 14:20:36
【问题描述】:
为什么要在 ASP.NET 中使用 JSON?你能举一个实际的例子吗?我读过文章,但不是很好。
【问题讨论】:
为什么要在 ASP.NET 中使用 JSON?你能举一个实际的例子吗?我读过文章,但不是很好。
【问题讨论】:
从网络服务返回数据怎么样? 以下是适用于 .Net 2.0 的两种方法,它们采用 DataTable 或 DataRow 参数,并返回 JSON 格式的字符串以从 Web 服务发送到客户端:
public string GetJson(DataRow r)
{
int index = 0;
StringBuilder json = new StringBuilder();
foreach (DataColumn item in r.Table.Columns)
{
json.Append(String.Format("\"{0}\" : \"{1}\"", item.ColumnName, r[item.ColumnName].ToString().Replace("\"","\\\"")));
if (index < r.Table.Columns.Count - 1)
{
json.Append(", ");
}
index++;
}
return "{" + json.ToString() + "}";
}
public string GetJson(DataTable t)
{
int index = 0;
StringBuilder json = new StringBuilder();
foreach (DataRow currRow in t.Rows)
{
json.Append(GetJson(currRow));
if (index < t.Rows.Count - 1)
{
json.Append(", ");
}
}
return "[" + json.ToString() + "]";
}
然后可以在客户端上发送和评估结果。
【讨论】:
JSON 非常适合添加 Ajax 功能。例如,您可以使用返回 JSON 对象的 Ajax 请求返回的一些值填充 ComboBox 的内容。
ASP.NET Ajax 在内部使用 JSON。如果你在使用另一个框架,比如 jQuery,你自己做客户端和服务器端。
JSON 很容易被人和计算机读取,并且引入的开销很小。 JavaScript 客户端代码可以原生解析 JSON。
【讨论】:
有很多用途、API、Web 服务,而且它的开销比 XML 少得多。作为实际示例,您可以通过几行代码使用 JSON 数据填充 ExtJs 树或网格。
如果您使用的是 ASP.NET MVC,那么从控制器返回 JSON 非常容易,如下所示:
// this method return JSON directly
public JsonResult GetData() {
data = LoadData(); // load the data from a database or a service
return Json(data); // will serialize your data object as JSON
}
【讨论】:
使用 JSON,因为它很容易在浏览器中解析 - 只需调用 eval() 即可完成。
只要我们将 DataTable 共享到 JSON 实现:
public static string DataTableToJSON(DataTable dt)
{
string rowDelimiter = "";
StringBuilder result = new StringBuilder("[");
foreach (DataRow row in dt.Rows)
{
result.Append(rowDelimiter);
result.Append(DataRowToJSON(row));
rowDelimiter = ",";
}
result.Append("]");
return result.ToString();
}
public static string DataRowToJSON(DataRow row)
{
DataColumnCollection cols = row.Table.Columns;
string colDelimiter = "";
StringBuilder result = new StringBuilder("{");
for (int i = 0; i < cols.Count; i++)
{ // use index rather than foreach, so we can use the index for both the row and cols collection
result.AppendFormat("{0}\"{1}\":{2}",
colDelimiter, cols[i].ColumnName,
PrepJSONValue(row[i], cols[i].DataType));
colDelimiter = ",";
}
result.Append("}");
return result.ToString();
}
// possible types:
// http://msdn.microsoft.com/en-us/library/system.data.datacolumn.datatype(VS.80).aspx
private static Type[] numeric = new Type[] {typeof(byte), typeof(decimal), typeof(double),
typeof(Int16), typeof(Int32), typeof(SByte), typeof(Single),
typeof(UInt16), typeof(UInt32), typeof(UInt64)};
private static long EpochTicks = new DateTime(1970, 1, 1).Ticks;
private static string PrepJSONValue(object value, Type DataType)
{
// null
if (value == DBNull.Value) return "null";
// numeric
if (Array.IndexOf(numeric, DataType) > -1)
return value.ToString(); // TODO: eventually want to use a stricter format
// boolean
if (DataType == typeof(bool))
return ((bool)value) ? "true" : "false";
// date -- see http://weblogs.asp.net/bleroy/archive/2008/01/18/dates-and-json.aspx
if (DataType == typeof(DateTime))
return "\"\\/Date(" + new TimeSpan(((DateTime)value).ToUniversalTime().Ticks - EpochTicks).TotalMilliseconds.ToString() + ")\\/\"";
// TODO: add Timespan support
// TODO: add Byte[] support
// string/char
return "\"" + value.ToString().Replace(@"\", @"\\").Replace(Environment.NewLine, @"\n").Replace("\"", @"\""") + "\"";
}
【讨论】:
返回 JSON 对象的 Ajax 调用可以简单地转换为 JavaScript 对象,例如
var jsObject = eval( "(" + ajaxCallReturningJson(whatever) + ")" );
这使得将复杂数据传递给客户端非常方便,而无需进行自定义表示或使用 XML/XSLT。
【讨论】:
JSON 比 XML 更容易解析,而且有很多选择。
【讨论】:
这是一种将 javascript 对象直接注入您的网页的方法,该对象可在您的所有其他客户端脚本中使用 OOP 表示法访问,而无需在客户端进行解析或处理。
【讨论】:
你有什么选择? XML 比 JSON 重,因此它使用更多带宽(但对于验证和转换数据非常强大), YAML 需要缩进和换行符,使其成为通过 Http 发送的次优格式(但适合存储日志、数据和配置)。 JSON 是原生 javascript,而且轻量级,所以它在客户端和通过 Http 传输非常棒
【讨论】:
这是一篇非常好的文章,介绍了为什么 JSON 是发送和接收数据的首选方法。
【讨论】: