Size2JsonConverter.cs 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  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="SizeF"/> value to or from JSON.
  7. /// </summary>
  8. public class Size2JsonConverter : JsonConverter<SizeF>
  9. {
  10. /// <inheritdoc />
  11. public override bool CanConvert(Type typeToConvert) => typeToConvert == typeof(SizeF);
  12. /// <inheritdoc />
  13. /// <exception cref="JsonException">
  14. /// Thrown if the JSON property does not contain a properly formatted <see cref="SizeF"/> value
  15. /// </exception>
  16. public override SizeF Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
  17. {
  18. var values = reader.ReadAsMultiDimensional<float>(options);
  19. if (values.Length == 2)
  20. {
  21. return new SizeF(values[0], values[1]);
  22. }
  23. if (values.Length == 1)
  24. {
  25. return new SizeF(values[0], values[0]);
  26. }
  27. throw new JsonException("Invalid Size2 property value");
  28. }
  29. /// <inheritdoc />
  30. /// <exception cref="ArgumentNullException">
  31. /// Throw if <paramref name="writer"/> is <see langword="null"/>.
  32. /// </exception>
  33. public override void Write(Utf8JsonWriter writer, SizeF value, JsonSerializerOptions options)
  34. {
  35. ArgumentNullException.ThrowIfNull(writer);
  36. writer.WriteStringValue($"{value.Width} {value.Height}");
  37. }
  38. }