CSharp · Console
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization.Formatters;
using System.IO;
using System.Data;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Reflection;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
using NUnit.Framework; // Throws NUnit.Framework.AssertionException
//https://stackoverflow.com/questions/33399749/convert-a-data-row-to-a-json-object/33400729#33400729
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)
{
var table = row.Table;
if (table == null)
throw new JsonSerializationException("no table");
var contractResolver = serializer.ContractResolver as DefaultContractResolver;
writer.WriteStartObject();
foreach (DataColumn col in row.Table.Columns)
{
var value = row[col];
if (serializer.NullValueHandling == NullValueHandling.Ignore && (value == null || value == DBNull.Value))
continue;
writer.WritePropertyName(contractResolver != null ? contractResolver.GetResolvedPropertyName(col.ColumnName) : col.ColumnName);
serializer.Serialize(writer, value);
}
writer.WriteEndObject();
}
}
public class TestClass
{
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""}}");
table.Rows.Add(row);
row = table.NewRow();
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""}}");
table.Rows.Add(row);
row = table.NewRow();
row["America"] = null;
row["Africa"] = JsonConvert.DeserializeObject<Place>(@"{""Id"":13,""Title"":""EG""}");
row["Japan"] = null;
table.Rows.Add(row);
return table;
}
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() },
// Add other settings as required, e.g.
NullValueHandling = NullValueHandling.Ignore,
};
var rowJson = JsonConvert.SerializeObject(row, Formatting.Indented, settings);
Console.WriteLine("JSON for row {0}:", rowIndex);
Console.WriteLine(rowJson);
}
}
}
public class Values
{
public int ValID { get; set; }
public string Type { get; set; }
}
public class Place
{
public int Id { get; set; }
public string Title { get; set; }
public Values Values { get; set; }
}
public class Program
{
public static void Main()
{
Console.WriteLine("Environment version: " + Environment.Version);
Console.WriteLine("Json.NET version: " + typeof(JsonSerializer).Assembly.FullName);
Console.WriteLine();
try
{
TestClass.Test();
}
catch (Exception ex)
{
Console.WriteLine("Failed with unhandled exception: ");
Console.WriteLine(ex);
throw;
}
}
}