Hello,
I would suggest the following improvements:
1. Add support for the following C# data types:
- boolean variables (true/false)
- numbers (integers, decimal, floating point)
- System.DateTime
2. Add support for the following special characters:
- ' (apostrophe)
- " (quote)
- \r\n (new line)
- \ (backslash)
In your JSON_DataTable() function, instead of writing:
JsonString.Append("{" + "\"DATA\":\"" + dt.Rows[i][j].ToString() + "\"}");
you could have written something like this:
public string JSON_DataTable(DataTable dt)
{
StringBuilder JsonString = new StringBuilder();
JsonString.Append("{ ");
JsonString.Append("\"TABLE\":[{ ");
JsonString.Append("\"ROW\":[ ");
for (int i = 0; i < dt.Rows.Count; i++)
{
JsonString.Append("{ ");
JsonString.Append("\"COL\":[ ");
for (int j = 0; j < dt.Columns.Count; j++)
{
switch (dt.Columns[j].DataType.ToString())
{
case "System.DateTime":
JsonString.Append("{ \"DATA\": " );
DateTime cv = (DateTime)dt.Rows[i][j];
JsonString.Append("new Date(" + cv.Year + "," + (cv.Month - 1) + "," + cv.Day + "," + cv.Hour + "," + cv.Minute + "," + cv.Second + "," + cv.Millisecond + ")");
JsonString.Append("} ");
break;
case "System.Boolean":
JsonString.Append("{ \"DATA\": " );
JsonString.Append(dt.Rows[i][j].ToString().ToLower());
JsonString.Append("}");
break;
case "System.Decimal":
case "System.Single":
case "System.Double":
case "System.UInt16":
case "System.UInt32":
case "System.Int16":
case "System.Int32":
case "System.Byte":
case "System.SByte":
JsonString.Append("{ \"DATA\": " );
JsonString.Append(dt.Rows[i][j].ToString() );
JsonString.Append("}");
break;
default:
JsonString.Append("{ \"DATA\":\"");
StringBuilder columnValue = new StringBuilder();
columnValue.Append(dt.Rows[i][j].ToString() );
columnValue = columnValue.Replace("\\", "\\\\\\\\");
//replace \" with \\\\\" (double quotes)
columnValue = columnValue.Replace("\" ", "\\\\\"");
columnValue = columnValue.Replace("'", "\\\'");
columnValue = columnValue.Replace("\r", "\\\\r");
columnValue = columnValue.Replace("\n", "\\\\n");
JsonString.Append(columnValue);
JsonString.Append("\"}");
break;
}
if (j < dt.Columns.Count - 1)
{
JsonString.Append(",");
}
}
if (i == dt.Rows.Count - 1)
{
JsonString.Append("]} ");
}
else
{
JsonString.Append("]}, ");
}
}
JsonString.Append("]}]}");
return JsonString.ToString();
}
The generated JSON strings will look something like this:
var a='{ "TABLE":[{ "ROW":[ { "COL":[ { "DATA":"Sibiu"},{ "DATA":"Romania"}]}, { "COL":[ { "DATA":"Chester \' \\\\ field"},{ "DATA":"United \\r\\n Kingdom \\""}]} ]}]}';
var t='{ "TABLE":[{ "ROW":[ { "COL":[ { "DATA":"TOMSMI"},{ "DATA":"Tom Smith"},{ "DATA":"DAT001"},{ "DATA": true},{ "DATA": 30},{ "DATA": new Date(1968,9,9,8,15,0,420)} ,{ "DATA": 25},{ "DATA": 1.1},{ "DATA": 3.3},{ "DATA": 245},{ "DATA":"a"}]}, { "COL":[ { "DATA":"ANTANU"},{ "DATA":"Anton Anuta"},{ "DATA":"INS001"},{ "DATA": true},{ "DATA": 120},{ "DATA": new Date(2007,8,11,22,6,19,625)} ,{ "DATA": 25},{ "DATA": 1.1},{ "DATA": 3.3},{ "DATA": 245},{ "DATA":"a"}]} ]}]}';
And the evaluation goes on something like this:
var addresses = eval("("+ a +")") ;
alert(addresses.TABLE[0].ROW[0].COL[0].DATA+' - '+addresses.TABLE[0].ROW[0].COL[1].DATA);
alert(addresses.TABLE[0].ROW[1].COL[0].DATA+' - '+addresses.TABLE[0].ROW[1].COL[1].DATA);
var testers = eval("("+ t +")") ;
alert(testers.TABLE[0].ROW[0].COL[3].DATA+' - '+testers.TABLE[0].ROW[0].COL[4].DATA);
alert(testers.TABLE[0].ROW[0].COL[4].DATA+' - '+testers.TABLE[0].ROW[0].COL[5].DATA);
-- modified at 15:45 Tuesday 11th September, 2007
|