using System; using System.Text.Json; using System.Text.Json.Serialization; using MonoGame.Extended.Graphics; namespace MonoGame.Extended.Serialization.Json; /// /// Converts a value to or from JSON. /// public class NinePatchJsonConverter : JsonConverter { private readonly ITextureRegionService _textureRegionService; /// /// Initializes a new instance of the class. /// /// The texture region service used to retrieve texture regions. public NinePatchJsonConverter(ITextureRegionService textureRegionService) { _textureRegionService = textureRegionService; } /// public override bool CanConvert(Type typeToConvert) => typeToConvert == typeof(NinePatch); /// /// /// Thrown if the JSON property does not contain a properly formatted value /// public override NinePatch Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.StartObject) { throw new JsonException($"Expected {nameof(JsonTokenType.StartObject)} token"); } string padding = string.Empty; string regionName = string.Empty; while (reader.Read()) { if (reader.TokenType == JsonTokenType.EndObject) { break; } if (reader.TokenType == JsonTokenType.PropertyName) { var propertyName = reader.GetString(); reader.Read(); if (propertyName.Equals("Padding", StringComparison.Ordinal)) { padding = reader.GetString(); } else if (propertyName.Equals("TextureRegion", StringComparison.Ordinal)) { regionName = reader.GetString(); } } } if (string.IsNullOrEmpty(padding) || string.IsNullOrEmpty(regionName)) { throw new JsonException($"Missing required properties \"Padding\" and \"TextureRegion\""); } var thickness = Thickness.Parse(padding); var region = _textureRegionService.GetTextureRegion(regionName); return region.CreateNinePatch(thickness); } /// /// /// Throw if is . /// public override void Write(Utf8JsonWriter writer, NinePatch value, JsonSerializerOptions options) { ArgumentNullException.ThrowIfNull(writer); if (value is null) { writer.WriteNullValue(); return; } writer.WriteStartObject(); writer.WriteString("TextureRegion", value.Name); writer.WriteString("Padding", value.Padding.ToString()); writer.WriteEndObject(); } }