using System.Collections.Generic;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Serialization;
public static void Main()
Console.WriteLine("Deseriialize DataTable to Json with byte[]");
Console.WriteLine("The Original datatable structure");
ITraceWriter traceWriter = new MemoryTraceWriter();
var settings = new JsonSerializerSettings
TypeNameHandling =TypeNameHandling.Objects,
TraceWriter = traceWriter,
Formatting = Newtonsoft.Json.Formatting.Indented,
settings.Converters.Add(new ByteConverter());
var json = JsonConvert.SerializeObject(dt, settings);
Console.WriteLine("-----json-------");
var dt2= JsonConvert.DeserializeObject<DataTable>(json, settings);
Console.WriteLine("The generated datatable structure");
public static DataTable GetDataTable()
DataTable dataTable = new DataTable("table");
dataTable.Columns.Add("f1", typeof(byte[]));
dataTable.Columns.Add("f2", typeof(string));
dataTable.Columns.Add("id", typeof(int));
dataTable.Columns.Add("mydatatable", typeof(DataTable));
dataTable.Columns.Add("myEntity", typeof(Entity));
DataRow newRow = dataTable.NewRow();
newRow["f1"] = new byte[]{0xE6,0x10, 0x00,0x24,0x40 };
DataTable dataTable2 = new DataTable("table");
dataTable2.Columns.Add("xyz", typeof(int));
DataRow newRow2 = dataTable2.NewRow();
dataTable2.Rows.Add(newRow2);
newRow["mydatatable"] = dataTable2;
var entity = new Entity {id=1};
newRow["myEntity"] = entity;
dataTable.Rows.Add(newRow);
newRow = dataTable.NewRow();
newRow["f1"] = new byte[]{0xE6,0x1a, 0xf0,0x24,0x40 };
newRow["f2"] = "hi world";
dataTable.Rows.Add(newRow);
public static void DumpTableStructure(DataTable dt)
foreach (DataColumn column in dt.Columns)
Console.WriteLine("Name: {0} type: {1}", column.ColumnName, column.DataType);
public class ByteConverter : JsonConverter
public override bool CanConvert(Type objectType)
return objectType == typeof(byte[]);
public override bool CanWrite { get { return false; } }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
var value = (string)JToken.Load(reader);
return Convert.FromBase64String(value);
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
throw new NotImplementedException();