using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Serialization;
using System.Collections.Generic;
public class ConvolutedObject
public class MySerializationBinder : DefaultSerializationBinder
public MySerializationBinder(string context)
public override Type BindToType(string assemblyName, string typeName)
switch (typeName.ToLower())
default: return base.BindToType(assemblyName, typeName);
public class MyCustomConverter : JsonConverter
protected string ObjectFileConverter(string objectFile)
public override bool CanConvert(Type objectType)
return typeof(ConvolutedObject).GetTypeInfo().IsAssignableFrom(objectType.GetTypeInfo());
static List<string> errors = new List<string>();
static readonly JsonSerializerSettings _jsonSettings = new JsonSerializerSettings
Error = delegate (object sender, ErrorEventArgs args)
errors.Add(args.ErrorContext.Error.Message);
args.ErrorContext.Handled = true;
TypeNameHandling = TypeNameHandling.All,
ObjectCreationHandling = ObjectCreationHandling.Replace,
PreserveReferencesHandling = PreserveReferencesHandling.Objects,
SerializationBinder = new MySerializationBinder("Context")
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
JToken token = JToken.Load(reader);
string adaptedObject = token.ToString();
adaptedObject = ObjectFileConverter(adaptedObject);
return JsonConvert.DeserializeObject<ConvolutedObject>(adaptedObject, _jsonSettings);
public override bool CanWrite
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
throw new NotImplementedException();
public static void Main()
JsonConvert.DeserializeObject<MyNamespace.ConvolutedObject>(
GetJson(), new MyNamespace.MyCustomConverter());
public static string GetJson()