using System.Collections.Generic;
using Newtonsoft.Json.Linq;
public static void Main()
List<Base> x = new List<Base>()
new Child1() { Hey = "hey" },
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.Converters.Add(new CustomConverter());
string result = JsonConvert.SerializeObject(x, settings);
Console.WriteLine(result);
public class CustomConverter : JsonConverter
public override bool CanConvert(Type objectType)
return objectType.IsAssignableTo(typeof(Base));
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
JToken t = JToken.FromObject(value);
if (t.Type != JTokenType.Object)
IList<string> propertyNames = o.Properties().Select(p => p.Name).ToList();
ServerJsonTypeAttribute attribute = (ServerJsonTypeAttribute) value.GetType().GetCustomAttribute(typeof(ServerJsonTypeAttribute));
o.AddFirst(new JProperty("Type", attribute.Key));
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
throw new NotImplementedException("");
public abstract class Base { }
[ServerJsonTypeAttribute("Child1")]
public class Child1 : Base
public string Hey { get; set; }
[ServerJsonTypeAttribute("Child2")]
public class Child2 : Base
public int Ho { get; set; }
public class ServerJsonTypeAttribute : Attribute
public ServerJsonTypeAttribute(string key) { Key = key; }
public string Key { get; }