




JSON анализировать намного проще, чем XML, и для этого существует множество вариантов.
А когда возврат данных из веб-службы? Вот два метода, которые подходят для .Net 2.0, которые принимают DataTable или DataRow Parameter и возвращают отформатированную строку 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() + "]";
}
Затем результат можно отправить и оценить на клиенте.
JSON хорош для добавления функциональности Аякс. Например, вы можете заполнить содержимое ComboBox некоторыми значениями, возвращаемыми запросом Ajax, возвращающим объект JSON.
ASP.NET Ajax внутренне использует JSON. Если вы используете другой фреймворк, например jQuery, вы сами выполняете как клиентскую, так и серверную сторону.
JSON легко читается как людьми, так и компьютерами и требует небольших накладных расходов. Клиентский код JavaScript может изначально анализировать JSON.
Это способ напрямую внедрить объекты javascript, доступные во всех ваших других сценариях на стороне клиента, с использованием нотации ООП, на вашу веб-страницу, без необходимости синтаксического анализа или обработки на стороне клиента.
Используйте 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("\"", @"\""") + "\"";
}
Вместо eval () всегда лучше использовать библиотеку Крокфорда: json.org/js.html
Какие у вас есть альтернативы? XML тяжелее JSON, поэтому он использует большую пропускную способность (но эффективен для проверки и преобразования данных), YAML требует отступов и новых строк, что делает его неоптимальным форматом для отправки по Http (но подходит для хранения журналов, данных и конфигураций). JSON - это собственный javascript и легкий, поэтому он отлично подходит на стороне клиента и для передачи по Http.
Существует множество применений, API, веб-сервисов, и у него гораздо меньше накладных расходов, чем у XML. В качестве практического примера вы можете заполнить дерево или сетку ExtJs, используя данные JSON, с помощью нескольких строк кода.
Если вы используете 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
}
Вызов Ajax, который возвращает объект JSON, можно тривиально преобразовать в объект JavaScript, например.
var jsObject = eval( "(" + ajaxCallReturningJson(whatever) + ")" );
Это делает его очень удобным для передачи сложных данных клиенту без необходимости создавать собственное представление или дурачиться с XML / XSLT.
Вот очень хорошая статья о том, почему JSON является предпочтительным методом отправки и получения данных.
Вам просто нужно увеличить свой индекс в методе данных