using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
[JsonConverter(typeof(JsonProductConverted))]
public abstract class Product
[JsonConverter(typeof(NoConverter))]
public class ProductImpl : Product
public int Foo { get; set; }
public class NoConverter : JsonConverter
public override bool CanConvert(Type objectType)
public override bool CanRead { get { return false; } }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
throw new NotImplementedException();
public override bool CanWrite { get { return false; } }
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
throw new NotImplementedException();
public class JsonProductConverted : JsonConverter
public override bool CanWrite { get { return false; } }
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
throw new NotImplementedException();
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
if (reader.TokenType == JsonToken.Null)
JObject json = JObject.Load(reader);
var type = typeof(ProductImpl);
var res = json.ToObject(type, serializer);
public override bool CanConvert(Type objectType)
public static void Test()
var prod = new ProductImpl { Foo = 101 };
var json = JsonConvert.SerializeObject(prod);
var prod2 = JsonConvert.DeserializeObject<Product>(json);
var json2 = JsonConvert.SerializeObject(prod2);
Console.WriteLine("Deserialized product type: {0}", prod2.GetType());
Console.WriteLine("Deserialied and re-serialized JSON: {0}", json2);
Assert.IsTrue(prod2.GetType() == prod.GetType());
Assert.IsTrue(json2 == json);
public class AssertionFailedException : System.Exception
public AssertionFailedException() : base() { }
public AssertionFailedException(string s) : base(s) { }
public static class Assert
public static void IsTrue(bool value)
public static void IsTrue(bool value, string message)
throw new AssertionFailedException(message ?? "failed");
public static void Main()
Console.WriteLine("Environment version: " + Environment.Version);
Console.WriteLine("Json.NET version: " + typeof(JsonSerializer).Assembly.FullName);