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 CustomContractResolverf : CamelCasePropertyNamesContractResolver { protected override IValueProvider CreateMemberValueProvider(MemberInfo member) { var valueProvider = base.CreateMemberValueProvider(member); if (member is PropertyInfo property) { // 处理字符串属性 if (IsStringType(property.PropertyType)) { return new StringValueProvider(valueProvider); } // 处理可空值类型(DateTime?, int?, bool? 等) if (IsNullableValueType(property.PropertyType)) { return new NullableValueTypeProvider(valueProvider); } } return valueProvider; } private bool IsStringType(Type type) { return type == typeof(string) || (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>) && type.GetGenericArguments()[0] == typeof(string)); } private bool IsNullableValueType(Type type) { return type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>); } 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; } } private class NullableValueTypeProvider : IValueProvider { private readonly IValueProvider _innerProvider; public NullableValueTypeProvider(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; } } } public class CustomContractResolver : 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; } } }