using Newtonsoft.Json.Serialization; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace LiveForum.Code.JsonConverterExtend; public class NullToEmptyStringContractResolver : CamelCasePropertyNamesContractResolver { protected override IValueProvider CreateMemberValueProvider(MemberInfo member) { var valueProvider = base.CreateMemberValueProvider(member); // 处理字符串属性(包括可空字符串) if (member is PropertyInfo property && (property.PropertyType == typeof(string) || (property.PropertyType.IsGenericType && property.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>) && property.PropertyType.GetGenericArguments()[0] == typeof(string)))) { return new StringValueProvider(valueProvider); } return valueProvider; } private class StringValueProvider : IValueProvider { private readonly IValueProvider _innerProvider; public StringValueProvider(IValueProvider innerProvider) { _innerProvider = innerProvider; } public void SetValue(object target, object value) { _innerProvider.SetValue(target, value); } public object GetValue(object target) { var value = _innerProvider.GetValue(target); return value ?? string.Empty; } } }