I'm trying to serialize C# DataTable using Newtonsoft JsonConverter
Code :
JsonConvert.SerializeObject(dt); //dt is DataTable
Result I got is :
[
{
"Name": "Tiger Nixon",
"Position": "System Architect",
"Address": "Edinburgh",
"No": "5421"
},
{
"Name": "Garrett Winters",
"Position": "Accountant",
"Address": "Tokyo",
"No": "8422"
}
]
Result I want is :
{
"data": [
[
"Tiger Nixon",
"System Architect",
"Edinburgh",
"5421"
],
[
"Garrett Winters",
"Accountant",
"Tokyo",
"8422"
]
]
}
Is it possible to custom the output using Newtonsoft? I tried writing my own code to serialize the DataTable by using foreach
on the DataTable
but the performance is night and day compared to Newtonsoft.
Any help will be appreciated
You could do it with the following JsonConverter
:
public class DataTableTo2dArrayConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(DataTable).IsAssignableFrom(objectType);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var table = (DataTable)value;
var array2d = table.AsEnumerable().Select(row => table.Columns.Cast<DataColumn>().Select(col => row[col]));
serializer.Serialize(writer, new { data = array2d });
}
}
And then use it like:
var settings = new JsonSerializerSettings();
settings.Converters.Add(new DataTableTo2dArrayConverter());
var json = JsonConvert.SerializeObject(dt, Formatting.Indented, settings);
Note that my use of System.Data.DataTableExtensions.AsEnumerable()
requires a reference to System.Data.DataSetExtensions.dll
.
Here's how I did it after I read the link provided by JasonWilczak
public class JqueryDatatablesConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(DataTable).IsAssignableFrom(objectType);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
dynamic dt = (DataTable)value;
dynamic count = dt.Columns.Count - 1;
writer.WriteStartObject();
writer.WritePropertyName("data");
writer.WriteStartArray();
foreach (DataRow dr in dt.Rows) {
writer.WriteStartArray();
for (int x = 0; x <= count; x++) {
serializer.Serialize(writer, dr[x]);
}
writer.WriteEndArray();
}
writer.WriteEndArray();
writer.WriteEndObject();
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With