using Newtonsoft.Json.Linq;
using Formatting = Newtonsoft.Json.Formatting;
public static void Main()
DataTable table = new DataTable();
table.Columns.Add("Column1");
table.Columns.Add("Column2");
table.Columns.Add("Column3");
table.Rows.Add("1", "value1,value2", "value3", "value4,value5");
table.Rows.Add("2", "value1", "value2,value3", "value4,value5,value6");
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.Converters.Add(new CustomDataTableConverter());
settings.Formatting = Formatting.Indented;
string json = JsonConvert.SerializeObject(table, settings);
class CustomDataTableConverter : JsonConverter
public override bool CanConvert(Type objectType)
return objectType == typeof(DataTable);
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
DataTable table = (DataTable)value;
JArray array = new JArray();
foreach (DataRow row in table.Rows)
JObject obj = new JObject();
foreach (DataColumn col in table.Columns)
if (col.ColumnName == "Id") continue;
if (row[col] != null && row[col] != DBNull.Value)
string[] values = row[col].ToString().Split(',');
obj.Add(col.ColumnName, JArray.FromObject(values));
obj.Add(col.ColumnName, JValue.CreateNull());
public override bool CanRead
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
throw new NotImplementedException();