using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
public class DataRowConverter : JsonConverter<DataRow>
public override DataRow ReadJson(JsonReader reader, Type objectType, DataRow existingValue, bool hasExistingValue, JsonSerializer serializer)
throw new NotImplementedException(string.Format("{0} is only implemented for writing.", this));
public override void WriteJson(JsonWriter writer, DataRow row, JsonSerializer serializer)
throw new JsonSerializationException("no table");
var contractResolver = serializer.ContractResolver as DefaultContractResolver;
writer.WriteStartObject();
foreach (DataColumn col in row.Table.Columns)
if (serializer.NullValueHandling == NullValueHandling.Ignore && (value == null || value == DBNull.Value))
writer.WritePropertyName(contractResolver != null ? contractResolver.GetResolvedPropertyName(col.ColumnName) : col.ColumnName);
serializer.Serialize(writer, value);
static DataTable MakeTable()
var table = new DataTable();
table.Columns.Add("America", typeof(Place));
table.Columns.Add("Africa", typeof(Place));
table.Columns.Add("Japan", typeof(Place));
DataRow row = table.NewRow();
row["America"] = JsonConvert.DeserializeObject<Place>(@"{""Id"":1,""Title"":""Ka""}");
row["Africa"] = JsonConvert.DeserializeObject<Place>(@"{""Id"":2,""Title"":""Sf""}");
row["Japan"] = JsonConvert.DeserializeObject<Place>(@"{""Id"":3,""Title"":""Ja"",""Values"":{""ValID"":4,""Type"":""Okinawa""}}");
row["America"] = JsonConvert.DeserializeObject<Place>(@"{""Id"":4,""Title"":""CT""}");
row["Africa"] = JsonConvert.DeserializeObject<Place>(@"{""Id"":5,""Title"":""SA""}");
row["Japan"] = JsonConvert.DeserializeObject<Place>(@"{""Id"":6,""Title"":""Ja"",""Values"":{""ValID"":4,""Type"":""Tokyo""}}");
row["Africa"] = JsonConvert.DeserializeObject<Place>(@"{""Id"":13,""Title"":""EG""}");
public static void Test()
var datatable = MakeTable();
for (int rowIndex = 0; rowIndex < datatable.Rows.Count; rowIndex++)
var row = datatable.Rows[rowIndex];
var settings = new JsonSerializerSettings
Converters = { new DataRowConverter() },
NullValueHandling = NullValueHandling.Ignore,
var rowJson = JsonConvert.SerializeObject(row, Formatting.Indented, settings);
Console.WriteLine("JSON for row {0}:", rowIndex);
Console.WriteLine(rowJson);
public int ValID { get; set; }
public string Type { get; set; }
public int Id { get; set; }
public string Title { get; set; }
public Values Values { get; set; }
public static void Main()
Console.WriteLine("Environment version: " + Environment.Version);
Console.WriteLine("Json.NET version: " + typeof(JsonSerializer).Assembly.FullName);
Console.WriteLine("Failed with unhandled exception: ");