RangeJsonConverter.cs 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. using System;
  2. using System.Text.Json;
  3. using System.Text.Json.Serialization;
  4. namespace MonoGame.Extended.Serialization.Json;
  5. /// <summary>
  6. /// Converts a <see cref="Range{T}"/> value to or from JSON.
  7. /// </summary>
  8. [Obsolete("Use IntervalJsonConverter<T>. Range<T> will be removed in 6.0")]
  9. public class RangeJsonConverter<T> : JsonConverter<Range<T>> where T : IComparable<T>
  10. {
  11. /// <inheritdoc />
  12. public override bool CanConvert(Type typeToConvert) => typeToConvert == typeof(Range<T>);
  13. /// <inheritdoc />
  14. public override Range<T> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
  15. {
  16. Span<T> values = reader.ReadAsMultiDimensional<T>(options);
  17. if (values.Length == 2)
  18. {
  19. if (values[0].CompareTo(values[1]) < 0)
  20. {
  21. return new Range<T>(values[0], values[1]);
  22. }
  23. return new Range<T>(values[1], values[0]);
  24. }
  25. if (values.Length == 1)
  26. {
  27. return new Range<T>(values[0], values[0]);
  28. }
  29. throw new InvalidOperationException("Invalid range");
  30. }
  31. /// <inheritdoc />
  32. /// <exception cref="ArgumentNullException">
  33. /// Throw if <paramref name="writer"/> is <see langword="null"/>.
  34. /// </exception>
  35. public override void Write(Utf8JsonWriter writer, Range<T> value, JsonSerializerOptions options)
  36. {
  37. ArgumentNullException.ThrowIfNull(writer);
  38. writer.WriteStartArray();
  39. JsonSerializer.Serialize(writer, value.Min, options);
  40. JsonSerializer.Serialize(writer, value.Max, options);
  41. writer.WriteEndArray();
  42. }
  43. }