using System.Collections.Generic;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Serialization;
public static void Main()
GetDeviceRequest getDeviceRequest = new GetDeviceRequest()
SerialNumber = "123456789",
CommunicationRequest request = new CommunicationRequest(getDeviceRequest);
var ns = new CamelCaseNamingStrategy();
var settings = new JsonSerializerSettings {
ContractResolver = new DefaultContractResolver { NamingStrategy = ns },
Converters = new List<JsonConverter> { new CommunicationRequestConverter(ns) },
Formatting = Formatting.Indented
var json = JsonConvert.SerializeObject(request, settings);
var cr = JsonConvert.DeserializeObject<CommunicationRequest>(json, settings);
Console.WriteLine("Version: " + cr.Version);
Console.WriteLine("Request Type: " + cr.Request.GetType().Name);
Console.WriteLine("Request UserName: " + cr.Request.UserName);
Console.WriteLine("Request SerialNumber: " + ((GetDeviceRequest)cr.Request).SerialNumber);
public string UserName { get; set; }
public class GetDeviceRequest : BaseRequest
public string SerialNumber { get; set; }
public class CommunicationRequest
public CommunicationRequest() : this(null)
public CommunicationRequest(BaseRequest baseRequest, string version = "1.1")
this.Request = baseRequest;
public string Version { get; set; }
public BaseRequest Request { get; set; }
public class CommunicationRequestConverter : JsonConverter
NamingStrategy NamingStrategy { get; set; }
public CommunicationRequestConverter(NamingStrategy namingStrategy)
NamingStrategy = namingStrategy;
public override bool CanConvert(Type objectType)
return objectType == typeof(CommunicationRequest);
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
CommunicationRequest req = (CommunicationRequest)value;
JObject jo = new JObject(
new JProperty(GetPropertyName("Version"), req.Version),
new JProperty(GetPropertyName(req.Request.GetType().Name),
JObject.FromObject(req.Request, serializer))
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
JObject jo = JObject.Load(reader);
string versionPropertyName = GetPropertyName("Version");
JProperty requestProperty = jo.Properties().FirstOrDefault(p => p.Name != versionPropertyName);
Type baseRequestType = Assembly.GetAssembly(typeof(BaseRequest)).GetTypes()
.Where(t => t.IsClass && GetPropertyName(t.Name) == requestProperty.Name)
CommunicationRequest req = new CommunicationRequest
Version = (string)jo[versionPropertyName],
Request = (BaseRequest)requestProperty.Value.ToObject(baseRequestType, serializer)
private string GetPropertyName(string name)
return NamingStrategy.GetPropertyName(name, false);