// Copyright (c) 2015-2017 schick Informatik // Description: Helper Klasse damit die Deserialisierung richtig funktioniert, auch wenn man // einen TypeConverter auf die Klasse loslässt.. using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using System; using System.ComponentModel; namespace bsmd.database { public class NoTypeConverterJsonConverter : JsonConverter { private static readonly IContractResolver resolver = new NoTypeConverterContractResolver(); private class NoTypeConverterContractResolver : DefaultContractResolver { protected override JsonContract CreateContract(Type objectType) { if (typeof(T).IsAssignableFrom(objectType)) { var contract = this.CreateObjectContract(objectType); contract.Converter = null; // Also null out the converter to prevent infinite recursion. return contract; } return base.CreateContract(objectType); } } public override bool CanConvert(Type objectType) { return typeof(T).IsAssignableFrom(objectType); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { return JsonSerializer.CreateDefault(new JsonSerializerSettings { ContractResolver = resolver }).Deserialize(reader, objectType); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { JsonSerializer.CreateDefault(new JsonSerializerSettings { ContractResolver = resolver }).Serialize(writer, value); } } #region class MessageClassConverter public class MessageClassConverter : TypeConverter { public override bool CanConvertFrom(ITypeDescriptorContext context, System.Type sourceType) { if (sourceType == typeof(string)) { return true; } return base.CanConvertFrom(context, sourceType); } public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) { if (value is string) { string s = value.ToString(); //s = s.Replace("\\", ""); return JsonConvert.DeserializeObject(s); } return base.ConvertFrom(context, culture, value); } } #endregion }