git_bsmd/bsmd.database/NoTypeConverterJsonConverter.cs

75 lines
2.6 KiB
C#

// 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<T> : 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<T> : 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<T>(s);
}
return base.ConvertFrom(context, culture, value);
}
}
#endregion
}