为什么我要在ASP.NET中使用JSON?你能举一个实际的例子吗?我读过文章但不太好。
答案 0 :(得分:2)
从Web服务返回数据时怎么样? 以下是适用于.Net 2.0的两种方法,它们采用DataTable或DataRow参数,并从Web服务返回要发送到客户端的JSON格式字符串:
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() + "]";
}
然后可以在客户端上发送和评估结果。
答案 1 :(得分:2)
JSON适用于添加Ajax功能。例如,您可以使用返回JSON对象的Ajax请求返回的某些值填充ComboBox的内容。
ASP.NET Ajax在内部使用JSON。如果你正在使用另一个框架,比如jQuery,你自己同时做客户端和服务器端。
JSON很容易被人和计算机阅读,并且引入的开销很小。 JavaScript客户端代码可以原生解析JSON。
答案 2 :(得分:1)
使用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("\"", @"\""") + "\"";
}
答案 3 :(得分:1)
有很多用途,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
}
答案 4 :(得分:1)
返回JSON对象的Ajax调用可以简单地转换为JavaScript对象,例如。
var jsObject = eval( "(" + ajaxCallReturningJson(whatever) + ")" );
这使得将复杂数据传递到客户端非常方便,而无需进行自定义表示或使用XML / XSLT。
答案 5 :(得分:0)
JSON比XML更容易解析,并且有很多选项可以这样做。
答案 6 :(得分:0)
这是一种直接注入javascript对象的方法,可以在所有其他客户端脚本中使用OOP表示法访问您的网页,而无需在客户端进行解析或处理。
答案 7 :(得分:0)
你有什么选择? XML比JSON重,因此它使用更多带宽(但对于验证和转换数据非常有用), YAML需要缩进和换行,使其成为通过Http发送的次优格式(但适用于存储日志,数据和配置)。 JSON是原生的javascript,很轻,所以它在客户端很棒,并且通过Http进行传输
答案 8 :(得分:0)
这是一篇非常好的文章,说明为什么JSON是发送和接收数据的首选方法。