I work in an ASP MVC application, I have the need to build a Json string like this:
{
"columns": [
[ "Name" ],
[ "Position" ],
[ "Office" ],
[ "Extn." ],
[ "Start date" ],
[ "Salary" ]
],
"data": [
[
"Tiger Nixon",
"System Architect",
"Edinburgh",
"5421",
"2011/04/25",
"$320,800"
],
[
"Garrett Winters",
"Accountant",
"Tokyo",
"8422",
"2011/07/25",
"$170,750"
],
[
"Ashton Cox",
"Junior Technical Author",
"San Francisco",
"1562",
"2009/01/12",
"$86,000"
]
]
}
This chain must be built from the name of the columns and the content of the cells of each row of the DataTable, currently I use this logic to build the chain:
public string DataTableToJSONWithStringBuilder(DataTable table)
{
var jsonString = new StringBuilder();
if (table.Rows.Count > 0)
{
jsonString.Append("{\"columns\": ");
for (int j = 0; j < table.Columns.Count; j++)
{
jsonString.Append("[\"" + table.Columns[j].ColumnName + "\"],");
}
jsonString.Append("\"data\": [");
for (int i = 0; i < table.Rows.Count; i++)
{
if (i == 0)
jsonString.Append("[");
else
jsonString.Append(",[");
for (int j = 0; j < table.Columns.Count; j++)
{
if (j == 1)
{
jsonString.Append("\"" + table.Rows[i][j] + "\"");
} else if (j < table.Columns.Count - 1 && j > 1)
{
jsonString.Append(", \"" + table.Rows[i][j] + "\"");
}
else if (j == table.Columns.Count - 1)
{
jsonString.Append(", \"" + table.Rows[i][j] + "\"]");
}
}
}
jsonString.Append("]}");
}
return jsonString.ToString();
}
This function creates me a string like this:
{{" columns ": ["Description"],["Unit"],["Quantity"],["MAT MOVIL SA DE CV"],["MATERIALS INDUSTRIALES JEREZ S. DE RL DE CV"],[" GAMA MATERIALES Y ACEROS, SA DE CV"],["FERRETERA INDUSTRIAL ROMA, SA DE CV"],["REQUISICION DE MATERIAL"],["COMERCIAL TDK DE MONTERREY, SA DE CV"],["Comercializadora Branco SA DE CV"],["Harmak Materials SA DE CV "],["ACEROMEX SA DE CV"],["SYSTEM CLEANING"],["LOWES COMPANIES MEXICO S. DE RL DE CV"],["JESUS GARZA DE LA CRUZ"],["ENEDINA RIOS TREVIÑO"],["HOUSING SUPPLIER AND ARCHITECTS DM, SA DE CV"],["Construction Materials DPI SAPI de CV"],["Ferreteria Indumex SA de CV"],["ACEROS Y DERIVADOS SA DE CV "],["Viveros y Pastos Allende S de RL de CV"]," data": [["KG", "46", "Unit: $26.00 Total: $1,387.36", "Unit: $0.00 Total: $0.00", "Unit: $17.07 Total: $910.86", "Unit: $20.60 Total: $1,099.22", "Unit : $0.00 Total: $0.00", "Unit: $26.00 Total: $1,387.36", "Unit: $0.00 Total: $0.00", "Unit: $0.00 Total: $0.00", "Unit: $0.00 Total: $0.00", "Unit: $0.00 Total: $0.00 ", "Unit: $0.00 Total: $0.00", "Unit: $25.00 Total: $1,334.00", "Unit: $21.55 Total: $1,149.91", "Unit: $18.00
Total: $960.48", "Unit: $24.20 Total: $1,291.31", "Unit: $27.30 Total: $1,456.73", "Unit: $0.00 Total: $0.00", "n/a"],["KG", "90", "n/a", "Unit: $0.00 Total: $0.00", "Unit: $32.92 Total: $3,436.85", "Unit: $33.22 Total: $3,468.17", "Unit: $0.00
Total: $0.00", "Unit: $40.00 Total: $4,176.00", "Unit: $0.00
Total: $0.00", "Unit: $0.00 Total: $0.00", "Unit: $0.00 Total: $0.00", "Unit: $0.00 Total: $0.00", "Unit: $0.00 Total: $0.00", "Unit: $0.00 Total: $0.00", "Unit: $43.10 Total: $4,499.64", "Unit: $0.00 Total: $0.00", "Unit: $0.00 Total: $0.00", "Unit: $0.00 Total: $0.00", "Unit: $0.00 Total: $0.00", "Unit: $0.00 Total : $0.00"],["", "", "$1,196.00", "$0.00", "$3,748.02", "$3,937.40", "$0.00", "$4,796.00", "$0.00", "$0.00", "$0.00", "$0.00 ", "$0.00", "$1,150.00", "$4,870.30", "$828.00", "$1,113.20", "$1,255.80", "$0.00", "$0.00"],["", "", "$191.36", "$0.00", "$599.68", "$629.98", "$0.00", "$767.36", "$0.00", "$0.00" , "$0.00", "$0.00", "$0.00", "$184.00", "$779.25", "$132.48", "$178.11", "$200.93", "$0.00", "$0.00"],["", "", " $1,387.36", "$0.00", "$4,347.70", "$4,567.38", "$0.00", "$5,563.36", "$0.00", "$0.00", "$0.00", "$0.00", "$0.00", "$1,334.00", "$5,649.55" , "$960.48", "$1,291.31", "$1,456.73", "$0.00", "$0.00"]]}}
But I get this:
{ "xx": "{\"columns\": [\"Description\"],[\"Unit\"],[\"Quantity\"],[\"MAT MOVIL SA DE CV\"],[ \"MATERIALS INDUSTRIAL JEREZ S. DE RL DE CV\"],[\"GAMA MATERIALES Y ACEROS, SA DE CV\"],[\"FERRETERA INDUSTRIAL ROMA, SA DE CV\"],[\"MATERIAL REQUISITION \"],[\"COMERCIAL TDK DE MONTERREY, SA DE CV\"],[\"Comercializadora Branco SA DE CV\"],[\"Harmak Materials SA DE CV\"],[\"ACEROMEX SA DE CV \"],[\"SYSTEM CLEANING\"],[\"LOWES COMPANIES MEXICO S. DE RL DE CV\"],[\"JESUS GARZA DE LA CRUZ\"],[\"ENEDINA RIOS TREVIÑO\" ],[\"HOUSING SUPPLIER AND ARCHITECTS DM, SA DE CV\"],[\"Materials for Construction DPI SAPI de CV\"],[\"Ferreteria Indumex SA de CV\"],[\"ACEROS Y DERIVADOS SA DE CV\"],[\"Viveros y Pastos Allende S de RL de CV\ "],\"data\": [[\"KG\", \"46\", \"Unit: $26.00 Total: $1,387.36\", \"Unit: $0.00 Total: $0.00\", \"Unit: $17.07
Total: $910.86\", \"Unit: $20.60 Total: $1,099.22\", \"Unit: $0.00 Total: $0.00\", \"Unit: $26.00 Total: $1,387.36\", \"Unit: $0.00 Total: $0.00\", \"Unit: $0.00 Total: $0.00\", \"Unit: $0.00 Total: $0.00\", \"Unit: $0.00 Total: $0.00\", \"Unit: $0.00 Total: $0.00\", \"Unit: $25.00 Total : $1,334.00\", \"Unit: $21.55 Total: $1,149.91\", \"Unit: $18.00
Total: $960.48\", \"Unit: $24.20 Total: $1,291.31\", \"Unit: $27.30 Total: $1,456.73\", \ "Unit: $0.00 Total: $0.00\", \"n/a\"],[\"KG\", \"90\", \"n/a\", \"Unit: $0.00 Total: $0.00\" , \"Unit: $32.92 Total:$3,436.85\", \"Unit: $33.22 Total: $3,468.17\", \"Unit: $0.00 Total: $0.00\", \"Unit: $40.00
Total: $4,176.00\", \"Unit: $0.00 Total: $0.00\", \"Unit: $0.00 Total: $0.00\", \"Unit: $0.00 Total: $0.00\", \"Unit: $0.00
Total: $0.00\", \"Unit: $0.00 Total: $0.00\", \"Unit: $0.00
Total: $0.00\", \"Unit: $43.10 Total: $4,499.64\", \"Unit: $0.00 Total: $0.00\", \"Unit: $0.00 Total : $0.00\", \"Unit: $0.00
Total: $0.00\", \"Unit: $0.00 Total: $0.00\", \"Unit: $0.00
Total: $0.00\"],[\"\", \"\", \"$1,196.00\", \"$0.00\", \"$3,748.02\", \"$3,937.40\", \"$0.00\", \" $4,796.00\", \"$0.00\", \"$0.00\", \"$0.00\", \"$0.00\", \"$0.00\", \"$1,150.00\", \"$4,870.30\", \"$828.00\ ", \"$1,113.20\", \"$1,255.80\", \"$0.00\", \"$0.00\"],[\"\", \"\", \"$191.36\", \"$0.00\", \"$599.68\", \"$629.98\", \"$0.00\", \"$767.36\", \"$0.00\", \"$0.00\", \"$0.00\", \"$0.00\", \" $0.00\", \"$184.00\", \"$779.25\", \"$132.48\", \"$178.11\", \"$200.93\", \"$0.00\", \"$0.00\"],[\"\", \"\", \"$1,387.36\", \"$0.00\", \"$4,347.70\", \"$4,567.38\ ", \"$0.00\", \"$5,563.36\", \"$0.00\", \"$0.00\", \"$0.00\", \"$0.00\", \"$0.00\", \"$1,334.00\", \"$5,649.55\", \"$960.48\", \"$1,291.31\", \"$1,456.73\", \"$0.00\", \"$0.00\"]]}" }$1,334.00\", \"$5,649.55\", \"$960.48\", \"$1,291.31\", \"$1,456.73\", \"$0.00\", \"$0.00\"]]}" }$1,334.00\", \"$5,649.55\", \"$960.48\", \"$1,291.31\", \"$1,456.73\", \"$0.00\", \"$0.00\"]]}" }
To call the controller that returns that json string, I use this ajax snippet:
$.ajax({
url: '/controller/actionjson',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify({ 'params': parametros }),
type: "post",
dataType: 'json',
success: function (xx) {
alert(JSON.stringify(xx, null, 2));
}
});
What do I need to adjust to get the json structure I want?