using System.Collections;
using System.Collections.Generic;
using Microsoft.SqlServer.Types;
using Newtonsoft.Json.Serialization;
using System.Data.SqlTypes;
public SqlGeography f1 { get; set; }
public int id { get; set; }
public static void Main()
Console.WriteLine("Hello SqlGeography");
Console.WriteLine("------------Serialization of DataTable using AddSqlConverters");
var jsonString = SerializeToJson2(dt);
Console.WriteLine(jsonString);
Console.WriteLine("------------ Deserialize Json using DTO object");
var settings = new JsonSerializerSettings().AddSqlConverters();
var list = JsonConvert.DeserializeObject<List<TableRowDTO>>(jsonString, settings);
Console.WriteLine("Deserialized {0}", list);
foreach (var row in list)
string ID = row.id.ToString();
var f1 = (row.f1 as SqlGeography);
Console.WriteLine("row: {0} {1} {2}", ID, f1,f1.STSrid);
Console.WriteLine("------------ Serialize List<DTO> ");
var json2 = JsonConvert.SerializeObject(list, Newtonsoft.Json.Formatting.Indented, settings);
Console.WriteLine(json2);
static DataTable GetGeoTable()
DataTable dataTable = new DataTable("table");
dataTable.Columns.Add("f1", typeof(SqlGeography));
dataTable.Columns.Add("id", typeof(int));
DataRow newRow = dataTable.NewRow();
newRow["f1"] = SqlGeography.Point(20, 10, 4326);
dataTable.Rows.Add(newRow);
newRow = dataTable.NewRow();
newRow["f1"] = SqlGeography.Point(30, 15, 4326);
dataTable.Rows.Add(newRow);
foreach (DataRow row in dataTable.Rows)
Console.WriteLine("{0} {1}", ID, f1);
static string SerializeToJson(DataTable dt)
ITraceWriter traceWriter = new MemoryTraceWriter();
var options = new JsonSerializerSettings
Formatting = Newtonsoft.Json.Formatting.Indented,
TraceWriter = traceWriter,
var json = JsonConvert.SerializeObject(dt, options);
Console.WriteLine(traceWriter);
static string SerializeToJson2(DataTable dt)
Console.WriteLine("convert dt to list");
ITraceWriter traceWriter = new MemoryTraceWriter();
var options = new JsonSerializerSettings
Formatting = Newtonsoft.Json.Formatting.Indented,
TraceWriter = traceWriter,
var list= ConvertDataTable<TableRowDTO>(dt) ;
var json = JsonConvert.SerializeObject(list, options);
Console.WriteLine(traceWriter);
private static List<T> ConvertDataTable<T>(DataTable dt)
List<T> data = new List<T>();
foreach (DataRow row in dt.Rows)
T item = GetItem<T>(row);
private static T GetItem<T>(DataRow dr)
T obj = Activator.CreateInstance<T>();
foreach (DataColumn column in dr.Table.Columns)
foreach (PropertyInfo pro in temp.GetProperties())
if (pro.Name == column.ColumnName)
pro.SetValue(obj, dr[column.ColumnName], null);
class XnaFriendlyResolver : DefaultContractResolver {
protected override JsonContract CreateContract(Type objectType) {
Console.WriteLine("resolving");
if (objectType == typeof(SqlGeography)) {
return CreateObjectContract(objectType);
return base.CreateContract(objectType);
public static class SqlPrimitiveConverters
public static JsonSerializerSettings AddSqlConverters(this JsonSerializerSettings settings)
foreach (var converter in converters)
settings.Converters.Add(converter);
static readonly JsonConverter[] converters = new JsonConverter[]
new SqlBinaryConverter(),
new SqlBooleanConverter(),
new SqlDateTimeConverter(),
new SqlDecimalConverter(),
new SqlDoubleConverter(),
new SqlSingleConverter(),
new SqlStringConverter(),
abstract class SqlPrimitiveConverterBase<T> : JsonConverter where T : struct, INullable, IComparable
protected abstract object GetValue(T sqlValue);
public override bool CanConvert(Type objectType)
return typeof(T) == objectType;
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
serializer.Serialize(writer, GetValue(sqlValue));
class SqlBinaryConverter : SqlPrimitiveConverterBase<SqlBinary>
protected override object GetValue(SqlBinary sqlValue) { return sqlValue.Value; }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
if (reader.TokenType == JsonToken.Null)
return (SqlBinary)serializer.Deserialize<byte[]>(reader);
class SqlBooleanConverter : SqlPrimitiveConverterBase<SqlBoolean>
protected override object GetValue(SqlBoolean sqlValue) { return sqlValue.Value; }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
if (reader.TokenType == JsonToken.Null)
return (SqlBoolean)serializer.Deserialize<bool>(reader);
class SqlByteConverter : SqlPrimitiveConverterBase<SqlByte>
protected override object GetValue(SqlByte sqlValue) { return sqlValue.Value; }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
if (reader.TokenType == JsonToken.Null)
return (SqlByte)serializer.Deserialize<byte>(reader);
class SqlDateTimeConverter : SqlPrimitiveConverterBase<SqlDateTime>
protected override object GetValue(SqlDateTime sqlValue) { return sqlValue.Value; }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
if (reader.TokenType == JsonToken.Null)
return (SqlDateTime)serializer.Deserialize<DateTime>(reader);
class SqlDecimalConverter : SqlPrimitiveConverterBase<SqlDecimal>
protected override object GetValue(SqlDecimal sqlValue) { return sqlValue.Value; }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
if (reader.TokenType == JsonToken.Null)
return (SqlDecimal)serializer.Deserialize<decimal>(reader);
class SqlDoubleConverter : SqlPrimitiveConverterBase<SqlDouble>
protected override object GetValue(SqlDouble sqlValue) { return sqlValue.Value; }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
if (reader.TokenType == JsonToken.Null)
return (SqlDouble)serializer.Deserialize<double>(reader);
class SqlGuidConverter : SqlPrimitiveConverterBase<SqlGuid>
protected override object GetValue(SqlGuid sqlValue) { return sqlValue.Value; }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
if (reader.TokenType == JsonToken.Null)
return (SqlGuid)serializer.Deserialize<Guid>(reader);
class SqlInt16Converter : SqlPrimitiveConverterBase<SqlInt16>
protected override object GetValue(SqlInt16 sqlValue) { return sqlValue.Value; }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
if (reader.TokenType == JsonToken.Null)
return (SqlInt16)serializer.Deserialize<short>(reader);
class SqlInt32Converter : SqlPrimitiveConverterBase<SqlInt32>
protected override object GetValue(SqlInt32 sqlValue) { return sqlValue.Value; }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
if (reader.TokenType == JsonToken.Null)
return (SqlInt32)serializer.Deserialize<int>(reader);
class SqlInt64Converter : SqlPrimitiveConverterBase<SqlInt64>
protected override object GetValue(SqlInt64 sqlValue) { return sqlValue.Value; }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
if (reader.TokenType == JsonToken.Null)
return (SqlInt64)serializer.Deserialize<long>(reader);
class SqlMoneyConverter : SqlPrimitiveConverterBase<SqlMoney>
protected override object GetValue(SqlMoney sqlValue) { return sqlValue.Value; }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
if (reader.TokenType == JsonToken.Null)
return (SqlMoney)serializer.Deserialize<decimal>(reader);
class SqlSingleConverter : SqlPrimitiveConverterBase<SqlSingle>
protected override object GetValue(SqlSingle sqlValue) { return sqlValue.Value; }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
if (reader.TokenType == JsonToken.Null)
return (SqlSingle)serializer.Deserialize<float>(reader);
class SqlStringConverter : SqlPrimitiveConverterBase<SqlString>
protected override object GetValue(SqlString sqlValue) { return sqlValue.Value; }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
if (reader.TokenType == JsonToken.Null)
return (SqlString)serializer.Deserialize<string>(reader);