using System.Collections.Generic;
using Newtonsoft.Json.Serialization;
using Newtonsoft.Json.Linq;
public static void Main(string[] args)
Point pt = new Point(1,5);
JsonSerializerSettings settings = new JsonSerializerSettings()
ContractResolver = new CamelCasePropertyNamesContractResolver(),
Formatting = Formatting.Indented
settings.Converters.Add(new JsonPointConverter());
string json = JsonConvert.SerializeObject(pt, settings);
public class JsonPointConverter : JsonConverter
protected object Create(Type objectType, JObject jObject)
if (jObject["$type"] != null)
string typeName = jObject["$type"].ToString();
return Activator.CreateInstance(objectType);
throw new InvalidOperationException("No supported type");
public override bool CanConvert(Type objectType)
return typeof(Point).IsAssignableFrom(objectType);
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
JObject jObject = JObject.Load(reader);
var target = Create(objectType, jObject);
serializer.Populate(jObject.CreateReader(), target);
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
Point? p = value as Point?;
JObject jo = new JObject();
jo.Add("type", value.GetType().Name);
jo.Add("X", new JValue(p.Value.X));
jo.Add("Y", new JValue(p.Value.Y));