JsonPipeDelimitedCollectionConverterFactory.cs 1.3 KB

12345678910111213141516171819202122232425262728293031
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text.Json;
  4. using System.Text.Json.Serialization;
  5. namespace Jellyfin.Extensions.Json.Converters
  6. {
  7. /// <summary>
  8. /// Json Pipe delimited collection converter factory.
  9. /// </summary>
  10. /// <remarks>
  11. /// This must be applied as an attribute, adding to the JsonConverter list causes stack overflow.
  12. /// </remarks>
  13. public class JsonPipeDelimitedCollectionConverterFactory : JsonConverterFactory
  14. {
  15. /// <inheritdoc />
  16. public override bool CanConvert(Type typeToConvert)
  17. {
  18. return typeToConvert.IsArray
  19. || (typeToConvert.IsGenericType
  20. && (typeToConvert.GetGenericTypeDefinition().IsAssignableFrom(typeof(IReadOnlyCollection<>)) || typeToConvert.GetGenericTypeDefinition().IsAssignableFrom(typeof(IReadOnlyList<>))));
  21. }
  22. /// <inheritdoc />
  23. public override JsonConverter? CreateConverter(Type typeToConvert, JsonSerializerOptions options)
  24. {
  25. var structType = typeToConvert.GetElementType() ?? typeToConvert.GenericTypeArguments[0];
  26. return (JsonConverter?)Activator.CreateInstance(typeof(JsonPipeDelimitedCollectionConverter<>).MakeGenericType(structType));
  27. }
  28. }
  29. }