ContentManagerJsonConverter.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. using System;
  2. using System.Text.Json;
  3. using System.Text.Json.Serialization;
  4. using Microsoft.Xna.Framework.Content;
  5. namespace MonoGame.Extended.Serialization.Json;
  6. /// <summary>
  7. /// Loads content from a JSON file into the <see cref="ContentManager"/> using the asset name
  8. /// </summary>
  9. /// <typeparam name="T">The type of content to load</typeparam>
  10. public class ContentManagerJsonConverter<T> : JsonConverter<T>
  11. {
  12. private readonly ContentManager _contentManager;
  13. private readonly Func<T, string> _getAssetName;
  14. /// <summary>
  15. /// Initializes a new instance of the <see cref="ContentManagerJsonConverter{T}"/> class.
  16. /// </summary>
  17. /// <param name="contentManager">The <see cref="ContentManager"/> used to load content.</param>
  18. /// <param name="getAssetName">A function that returns the asset name for a given instance of <typeparamref name="T"/>.</param>
  19. public ContentManagerJsonConverter(ContentManager contentManager, Func<T, string> getAssetName)
  20. {
  21. _contentManager = contentManager;
  22. _getAssetName = getAssetName;
  23. }
  24. /// <inheritdoc />
  25. public override bool CanConvert(Type typeToConvert) => typeToConvert == typeof(T);
  26. /// <inheritdoc />
  27. public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
  28. {
  29. var assetName = reader.GetString();
  30. return _contentManager.Load<T>(assetName);
  31. }
  32. /// <inheritdoc />
  33. /// <exception cref="ArgumentNullException">
  34. /// Throw if <paramref name="writer"/> is <see langword="null"/>.
  35. /// </exception>
  36. public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
  37. {
  38. ArgumentNullException.ThrowIfNull(writer);
  39. var asset = value;
  40. var assetName = _getAssetName(asset);
  41. writer.WriteStringValue(assetName);
  42. }
  43. }