CompositeContractResolver.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. using System;
  2. using System.Collections.Generic;
  3. using Newtonsoft.Json;
  4. using Newtonsoft.Json.Serialization;
  5. using System.Linq;
  6. using System.Reflection;
  7. namespace Masuit.Tools.Systems;
  8. /// <summary>
  9. /// 支持只允许反序列化属性和多别名属性的解释器
  10. /// </summary>
  11. public class CompositeContractResolver : FallbackJsonPropertyResolver
  12. {
  13. protected override IValueProvider CreateMemberValueProvider(MemberInfo member)
  14. {
  15. IValueProvider provider = base.CreateMemberValueProvider(member);
  16. if (member.MemberType == MemberTypes.Property)
  17. {
  18. Type propType = ((PropertyInfo)member).PropertyType;
  19. if (propType.IsGenericType &&
  20. propType.GetGenericTypeDefinition() == typeof(List<>))
  21. {
  22. return new EmptyListValueProvider(provider, propType);
  23. }
  24. }
  25. return provider;
  26. }
  27. protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
  28. {
  29. var property = base.CreateProperty(member, memberSerialization);
  30. if (property.AttributeProvider.GetAttributes(typeof(DeserializeOnlyJsonPropertyAttribute), true).Union(property.AttributeProvider.GetAttributes(typeof(SerializeIgnoreAttribute), true)).Any())
  31. {
  32. property.ShouldSerialize = _ => false;
  33. }
  34. if (property.AttributeProvider.GetAttributes(typeof(SerializeOnlyJsonPropertyAttribute), true).Union(property.AttributeProvider.GetAttributes(typeof(DeserializeIgnoreAttribute), true)).Any())
  35. {
  36. property.ShouldDeserialize = _ => false;
  37. }
  38. return property;
  39. }
  40. }
  41. internal class EmptyListValueProvider(IValueProvider innerProvider, Type listType) : IValueProvider
  42. {
  43. private readonly object _defaultValue = Activator.CreateInstance(listType);
  44. public void SetValue(object target, object value)
  45. {
  46. innerProvider.SetValue(target, value ?? _defaultValue);
  47. }
  48. public object GetValue(object target)
  49. {
  50. return innerProvider.GetValue(target) ?? _defaultValue;
  51. }
  52. }