JsonConvert.DefaultSettings = () =>
{
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = StrNullToEmptyContractResolver.DefaultInstance;
return settings;
};
class StrNullToEmptyContractResolver : DefaultContractResolver
{
public static StrNullToEmptyContractResolver DefaultInstance;
static StrNullToEmptyContractResolver()
{
DefaultInstance = new StrNullToEmptyContractResolver();
}
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var jp = base.CreateProperty(member, memberSerialization);
if (jp.PropertyType != typeof(string))
{
return jp;
}
if (jp.ValueProvider is ReflectionValueProvider)
{
jp.ValueProvider = new ReflectionStrNullToEmptyValueProvider(member);
}
else if (jp.ValueProvider is DynamicValueProvider)
{
jp.ValueProvider = new DynamicStrNullToEmptyValueProvider(member);
}
return jp;
}
class DynamicStrNullToEmptyValueProvider : DynamicValueProvider, IValueProvider
{
public DynamicStrNullToEmptyValueProvider(MemberInfo memberInfo) : base(memberInfo)
{
}
public new object GetValue(object target)
{
var value = base.GetValue(target);
if (value == null)
{
return string.Empty;
}
return value;
}
}
class ReflectionStrNullToEmptyValueProvider : ReflectionValueProvider, IValueProvider
{
public ReflectionStrNullToEmptyValueProvider(MemberInfo memberInfo) : base(memberInfo)
{
}
public new object GetValue(object target)
{
var value = base.GetValue(target);
if (value == null)
{
return string.Empty;
}
return value;
}
}
}