FallbackJsonPropertyResolver.cs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. using Newtonsoft.Json;
  2. using Newtonsoft.Json.Serialization;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Reflection;
  6. namespace Masuit.Tools.Systems;
  7. /// <summary>
  8. /// 多别名属性的解释器
  9. /// </summary>
  10. public class FallbackJsonPropertyResolver : CamelCasePropertyNamesContractResolver
  11. {
  12. protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
  13. {
  14. var typeMembers = GetSerializableMembers(type);
  15. var properties = new List<JsonProperty>();
  16. foreach (var member in typeMembers)
  17. {
  18. var property = CreateProperty(member, memberSerialization);
  19. properties.Add(property);
  20. var fallbackAttribute = member.GetCustomAttribute<FallbackJsonProperty>();
  21. if (fallbackAttribute == null)
  22. {
  23. continue;
  24. }
  25. property.PropertyName = fallbackAttribute.PreferredName;
  26. foreach (var alternateName in fallbackAttribute.FallbackReadNames)
  27. {
  28. var fallbackProperty = CreateProperty(member, memberSerialization);
  29. fallbackProperty.PropertyName = alternateName;
  30. fallbackProperty.ShouldSerialize = (x) => false;
  31. properties.Add(fallbackProperty);
  32. }
  33. }
  34. return properties;
  35. }
  36. }