diff --git a/DotTiled/Serialization/Tmj/ExtensionsJsonElement.cs b/DotTiled/Serialization/Tmj/ExtensionsJsonElement.cs new file mode 100644 index 0000000..d7620e4 --- /dev/null +++ b/DotTiled/Serialization/Tmj/ExtensionsJsonElement.cs @@ -0,0 +1,97 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text.Json; + +namespace DotTiled; + +internal static class ExtensionsJsonElement +{ + internal static T GetRequiredProperty(this JsonElement element, string propertyName) + { + if (!element.TryGetProperty(propertyName, out var property)) + throw new JsonException($"Missing required property '{propertyName}'."); + + return property.GetValueAs(); + } + + internal static T GetOptionalProperty(this JsonElement element, string propertyName, T defaultValue) + { + if (!element.TryGetProperty(propertyName, out var property)) + return defaultValue; + + return property.GetValueAs(); + } + + internal static T GetValueAs(this JsonElement element) + { + string val = typeof(T) switch + { + Type t when t == typeof(string) => element.GetString()!, + Type t when t == typeof(int) => element.GetInt32().ToString(CultureInfo.InvariantCulture), + Type t when t == typeof(uint) => element.GetUInt32().ToString(CultureInfo.InvariantCulture), + Type t when t == typeof(float) => element.GetSingle().ToString(CultureInfo.InvariantCulture), + _ => throw new JsonException($"Unsupported type '{typeof(T)}'.") + }; + + return (T)Convert.ChangeType(val, typeof(T), CultureInfo.InvariantCulture); + } + + internal static T GetRequiredPropertyParseable(this JsonElement element, string propertyName) where T : IParsable + { + if (!element.TryGetProperty(propertyName, out var property)) + throw new JsonException($"Missing required property '{propertyName}'."); + + return T.Parse(property.GetString()!, CultureInfo.InvariantCulture); + } + + internal static T GetRequiredPropertyParseable(this JsonElement element, string propertyName, Func parser) + { + if (!element.TryGetProperty(propertyName, out var property)) + throw new JsonException($"Missing required property '{propertyName}'."); + + return parser(property.GetString()!); + } + + internal static T GetOptionalPropertyParseable(this JsonElement element, string propertyName, T defaultValue) where T : IParsable + { + if (!element.TryGetProperty(propertyName, out var property)) + return defaultValue; + + return T.Parse(property.GetString()!, CultureInfo.InvariantCulture); + } + + internal static T GetOptionalPropertyParseable(this JsonElement element, string propertyName, Func parser, T defaultValue) + { + if (!element.TryGetProperty(propertyName, out var property)) + return defaultValue; + + return parser(property.GetString()!); + } + + internal static T GetRequiredPropertyCustom(this JsonElement element, string propertyName, Func parser) + { + if (!element.TryGetProperty(propertyName, out var property)) + throw new JsonException($"Missing required property '{propertyName}'."); + + return parser(property); + } + + internal static T GetOptionalPropertyCustom(this JsonElement element, string propertyName, Func parser, T defaultValue) + { + if (!element.TryGetProperty(propertyName, out var property)) + return defaultValue; + + return parser(property); + } + + internal static List GetValueAsList(this JsonElement element, Func parser) + { + var list = new List(); + + foreach (var item in element.EnumerateArray()) + list.Add(parser(item)); + + return list; + } +} diff --git a/DotTiled/Serialization/Tmj/Tmj.Map.cs b/DotTiled/Serialization/Tmj/Tmj.Map.cs index c76c391..d4ea6f1 100644 --- a/DotTiled/Serialization/Tmj/Tmj.Map.cs +++ b/DotTiled/Serialization/Tmj/Tmj.Map.cs @@ -7,84 +7,59 @@ namespace DotTiled; internal partial class Tmj { - internal static Map ReadMap(ref Utf8JsonReader reader) + internal static Map ReadMap(JsonElement element) { - string version = default!; - string tiledVersion = default!; - string @class = ""; - MapOrientation orientation = default; - RenderOrder renderOrder = RenderOrder.RightDown; - int compressionLevel = -1; - uint width = 0; - uint height = 0; - uint tileWidth = 0; - uint tileHeight = 0; - uint? hexSideLength = null; - StaggerAxis? staggerAxis = null; - StaggerIndex? staggerIndex = null; - float parallaxOriginX = 0.0f; - float parallaxOriginY = 0.0f; - Color backgroundColor = Color.Parse("#00000000", CultureInfo.InvariantCulture); - uint nextLayerID = 0; - uint nextObjectID = 0; - bool infinite = false; + var version = element.GetRequiredProperty("version"); + var tiledVersion = element.GetRequiredProperty("tiledversion"); + string @class = element.GetOptionalProperty("class", ""); + var orientation = element.GetRequiredPropertyParseable("orientation", s => s switch + { + "orthogonal" => MapOrientation.Orthogonal, + "isometric" => MapOrientation.Isometric, + "staggered" => MapOrientation.Staggered, + "hexagonal" => MapOrientation.Hexagonal, + _ => throw new JsonException($"Unknown orientation '{s}'") + }); + var renderOrder = element.GetOptionalPropertyParseable("renderorder", s => s switch + { + "right-down" => RenderOrder.RightDown, + "right-up" => RenderOrder.RightUp, + "left-down" => RenderOrder.LeftDown, + "left-up" => RenderOrder.LeftUp, + _ => throw new JsonException($"Unknown render order '{s}'") + }, RenderOrder.RightDown); + var compressionLevel = element.GetOptionalProperty("compressionlevel", -1); + var width = element.GetRequiredProperty("width"); + var height = element.GetRequiredProperty("height"); + var tileWidth = element.GetRequiredProperty("tilewidth"); + var tileHeight = element.GetRequiredProperty("tileheight"); + var hexSideLength = element.GetOptionalProperty("hexsidelength", null); + var staggerAxis = element.GetOptionalPropertyParseable("staggeraxis", s => s switch + { + "x" => StaggerAxis.X, + "y" => StaggerAxis.Y, + _ => throw new JsonException($"Unknown stagger axis '{s}'") + }, null); + var staggerIndex = element.GetOptionalPropertyParseable("staggerindex", s => s switch + { + "odd" => StaggerIndex.Odd, + "even" => StaggerIndex.Even, + _ => throw new JsonException($"Unknown stagger index '{s}'") + }, null); + var parallaxOriginX = element.GetOptionalProperty("parallaxoriginx", 0.0f); + var parallaxOriginY = element.GetOptionalProperty("parallaxoriginy", 0.0f); + var backgroundColor = element.GetOptionalPropertyParseable("backgroundcolor", s => Color.Parse(s, CultureInfo.InvariantCulture), Color.Parse("#00000000", CultureInfo.InvariantCulture)); + var nextLayerID = element.GetRequiredProperty("nextlayerid"); + var nextObjectID = element.GetRequiredProperty("nextobjectid"); + var infinite = element.GetOptionalProperty("infinite", 0) == 1; // At most one of - Dictionary? properties = null; + Dictionary? properties = element.GetOptionalPropertyCustom>("properties", ReadProperties, null); // Any number of List layers = []; List tilesets = []; - reader.ProcessJsonObject([ - new RequiredProperty("version", (ref Utf8JsonReader reader) => version = reader.Progress(reader.GetString()!)), - new RequiredProperty("tiledversion", (ref Utf8JsonReader reader) => tiledVersion = reader.Progress(reader.GetString()!)), - new OptionalProperty("class", (ref Utf8JsonReader reader) => @class = reader.Progress(reader.GetString() ?? ""), allowNull: true), - new RequiredProperty("orientation", (ref Utf8JsonReader reader) => orientation = reader.Progress(reader.GetString()) switch - { - "orthogonal" => MapOrientation.Orthogonal, - "isometric" => MapOrientation.Isometric, - "staggered" => MapOrientation.Staggered, - "hexagonal" => MapOrientation.Hexagonal, - _ => throw new JsonException("Invalid orientation.") - }), - new OptionalProperty("renderorder", (ref Utf8JsonReader reader) => renderOrder = reader.Progress(reader.GetString()) switch - { - "right-down" => RenderOrder.RightDown, - "right-up" => RenderOrder.RightUp, - "left-down" => RenderOrder.LeftDown, - "left-up" => RenderOrder.LeftUp, - _ => throw new JsonException("Invalid render order.") - }), - new OptionalProperty("compressionlevel", (ref Utf8JsonReader reader) => compressionLevel = reader.Progress(reader.GetInt32())), - new RequiredProperty("width", (ref Utf8JsonReader reader) => width = reader.Progress(reader.GetUInt32())), - new RequiredProperty("height", (ref Utf8JsonReader reader) => height = reader.Progress(reader.GetUInt32())), - new RequiredProperty("tilewidth", (ref Utf8JsonReader reader) => tileWidth = reader.Progress(reader.GetUInt32())), - new RequiredProperty("tileheight", (ref Utf8JsonReader reader) => tileHeight = reader.Progress(reader.GetUInt32())), - new OptionalProperty("hexsidelength", (ref Utf8JsonReader reader) => hexSideLength = reader.Progress(reader.GetUInt32())), - new OptionalProperty("staggeraxis", (ref Utf8JsonReader reader) => staggerAxis = reader.Progress(reader.GetString()) switch - { - "x" => StaggerAxis.X, - "y" => StaggerAxis.Y, - _ => throw new JsonException("Invalid stagger axis.") - }), - new OptionalProperty("staggerindex", (ref Utf8JsonReader reader) => staggerIndex = reader.Progress(reader.GetString()) switch - { - "odd" => StaggerIndex.Odd, - "even" => StaggerIndex.Even, - _ => throw new JsonException("Invalid stagger index.") - }), - new OptionalProperty("parallaxoriginx", (ref Utf8JsonReader reader) => parallaxOriginX = reader.Progress(reader.GetSingle())), - new OptionalProperty("parallaxoriginy", (ref Utf8JsonReader reader) => parallaxOriginY = reader.Progress(reader.GetSingle())), - new OptionalProperty("backgroundcolor", (ref Utf8JsonReader reader) => backgroundColor = Color.Parse(reader.Progress(reader.GetString()!), CultureInfo.InvariantCulture)), - new RequiredProperty("nextlayerid", (ref Utf8JsonReader reader) => nextLayerID = reader.Progress(reader.GetUInt32())), - new RequiredProperty("nextobjectid", (ref Utf8JsonReader reader) => nextObjectID = reader.Progress(reader.GetUInt32())), - new OptionalProperty("infinite", (ref Utf8JsonReader reader) => infinite = reader.Progress(reader.GetUInt32()) == 1), - - new OptionalProperty("properties", (ref Utf8JsonReader reader) => properties = ReadProperties(ref reader)), - new OptionalProperty("tilesets", (ref Utf8JsonReader reader) => tilesets = ReadTilesets(ref reader)) - ], "map"); - return new Map { Version = version, @@ -112,168 +87,175 @@ internal partial class Tmj }; } - internal static Dictionary ReadProperties(ref Utf8JsonReader reader) + internal static Dictionary ReadProperties(JsonElement element) { var properties = new Dictionary(); - reader.ProcessJsonArray((ref Utf8JsonReader reader) => + element.GetValueAsList(e => { - var property = ReadProperty(ref reader); - properties.Add(property.Name, property); - }); + var name = e.GetRequiredProperty("name"); + var type = e.GetOptionalPropertyParseable("type", s => s switch + { + "string" => PropertyType.String, + "int" => PropertyType.Int, + "float" => PropertyType.Float, + "bool" => PropertyType.Bool, + "color" => PropertyType.Color, + "file" => PropertyType.File, + "object" => PropertyType.Object, + "class" => PropertyType.Class, + _ => throw new JsonException("Invalid property type") + }, PropertyType.String); + + IProperty property = type switch + { + PropertyType.String => new StringProperty { Name = name, Value = e.GetRequiredProperty("value") }, + PropertyType.Int => new IntProperty { Name = name, Value = e.GetRequiredProperty("value") }, + PropertyType.Float => new FloatProperty { Name = name, Value = e.GetRequiredProperty("value") }, + PropertyType.Bool => new BoolProperty { Name = name, Value = e.GetRequiredProperty("value") }, + PropertyType.Color => new ColorProperty { Name = name, Value = e.GetRequiredPropertyParseable("value") }, + PropertyType.File => new FileProperty { Name = name, Value = e.GetRequiredProperty("value") }, + PropertyType.Object => new ObjectProperty { Name = name, Value = e.GetRequiredProperty("value") }, + PropertyType.Class => ReadClassProperty(e), + _ => throw new JsonException("Invalid property type") + }; + + return property!; + }).ForEach(p => properties.Add(p.Name, p)); return properties; } - internal static IProperty ReadProperty(ref Utf8JsonReader reader) + internal static ClassProperty ReadClassProperty(JsonElement element) { - string name = default!; - string type = default!; - IProperty property = null; + var name = element.GetRequiredProperty("name"); + var propertyType = element.GetRequiredProperty("propertytype"); - reader.ProcessJsonObject([ - new RequiredProperty("name", (ref Utf8JsonReader reader) => name = reader.Progress(reader.GetString()!)), - new RequiredProperty("type", (ref Utf8JsonReader reader) => type = reader.Progress(reader.GetString()!)), - new RequiredProperty("value", (ref Utf8JsonReader reader) => - { - property = type switch - { - "string" => new StringProperty { Name = name, Value = reader.Progress(reader.GetString()!) }, - "int" => new IntProperty { Name = name, Value = reader.Progress(reader.GetInt32()) }, - "float" => new FloatProperty { Name = name, Value = reader.Progress(reader.GetSingle()) }, - "bool" => new BoolProperty { Name = name, Value = reader.Progress(reader.GetBoolean()) }, - "color" => new ColorProperty { Name = name, Value = Color.Parse(reader.Progress(reader.GetString()!), CultureInfo.InvariantCulture) }, - "file" => new FileProperty { Name = name, Value = reader.Progress(reader.GetString()!) }, - "object" => new ObjectProperty { Name = name, Value = reader.Progress(reader.GetUInt32()) }, - // "class" => ReadClassProperty(ref reader), - _ => throw new JsonException("Invalid property type.") - }; - }), - ], "property"); + var properties = element.GetRequiredPropertyCustom>("properties", ReadProperties); - return property!; + return new ClassProperty { Name = name, PropertyType = propertyType, Properties = properties }; } - internal static List ReadTilesets(ref Utf8JsonReader reader) - { - var tilesets = new List(); + // internal static List ReadTilesets(ref Utf8JsonReader reader) + // { + // var tilesets = new List(); - reader.ProcessJsonArray((ref Utf8JsonReader reader) => - { - var tileset = ReadTileset(ref reader); - tilesets.Add(tileset); - }); + // reader.ProcessJsonArray((ref Utf8JsonReader reader) => + // { + // var tileset = ReadTileset(ref reader); + // tilesets.Add(tileset); + // }); - return tilesets; - } + // return tilesets; + // } - internal static Tileset ReadTileset(ref Utf8JsonReader reader) - { - string? version = null; - string? tiledVersion = null; - uint? firstGID = null; - string? source = null; - string? name = null; - string @class = ""; - uint? tileWidth = null; - uint? tileHeight = null; - uint? spacing = null; - uint? margin = null; - uint? tileCount = null; - uint? columns = null; - ObjectAlignment objectAlignment = ObjectAlignment.Unspecified; - FillMode fillMode = FillMode.Stretch; + // internal static Tileset ReadTileset(ref Utf8JsonReader reader) + // { + // string? version = null; + // string? tiledVersion = null; + // uint? firstGID = null; + // string? source = null; + // string? name = null; + // string @class = ""; + // uint? tileWidth = null; + // uint? tileHeight = null; + // uint? spacing = null; + // uint? margin = null; + // uint? tileCount = null; + // uint? columns = null; + // ObjectAlignment objectAlignment = ObjectAlignment.Unspecified; + // FillMode fillMode = FillMode.Stretch; - string? image = null; - uint? imageWidth = null; - uint? imageHeight = null; + // string? image = null; + // uint? imageWidth = null; + // uint? imageHeight = null; - Dictionary? properties = null; + // Dictionary? properties = null; - reader.ProcessJsonObject([ - new OptionalProperty("version", (ref Utf8JsonReader reader) => version = reader.Progress(reader.GetString())), - new OptionalProperty("tiledversion", (ref Utf8JsonReader reader) => tiledVersion = reader.Progress(reader.GetString())), - new OptionalProperty("firstgid", (ref Utf8JsonReader reader) => firstGID = reader.Progress(reader.GetUInt32())), - new OptionalProperty("source", (ref Utf8JsonReader reader) => source = reader.Progress(reader.GetString())), - new OptionalProperty("name", (ref Utf8JsonReader reader) => name = reader.Progress(reader.GetString())), - new OptionalProperty("class", (ref Utf8JsonReader reader) => @class = reader.Progress(reader.GetString() ?? ""), allowNull: true), - new OptionalProperty("tilewidth", (ref Utf8JsonReader reader) => tileWidth = reader.Progress(reader.GetUInt32())), - new OptionalProperty("tileheight", (ref Utf8JsonReader reader) => tileHeight = reader.Progress(reader.GetUInt32())), - new OptionalProperty("spacing", (ref Utf8JsonReader reader) => spacing = reader.Progress(reader.GetUInt32())), - new OptionalProperty("margin", (ref Utf8JsonReader reader) => margin = reader.Progress(reader.GetUInt32())), - new OptionalProperty("tilecount", (ref Utf8JsonReader reader) => tileCount = reader.Progress(reader.GetUInt32())), - new OptionalProperty("columns", (ref Utf8JsonReader reader) => columns = reader.Progress(reader.GetUInt32())), - new OptionalProperty("objectalignment", (ref Utf8JsonReader reader) => objectAlignment = reader.Progress(reader.GetString()) switch - { - "unspecified" => ObjectAlignment.Unspecified, - "topleft" => ObjectAlignment.TopLeft, - "top" => ObjectAlignment.Top, - "topright" => ObjectAlignment.TopRight, - "left" => ObjectAlignment.Left, - "center" => ObjectAlignment.Center, - "right" => ObjectAlignment.Right, - "bottomleft" => ObjectAlignment.BottomLeft, - "bottom" => ObjectAlignment.Bottom, - "bottomright" => ObjectAlignment.BottomRight, - _ => throw new JsonException("Invalid object alignment.") - }), - new OptionalProperty("fillmode", (ref Utf8JsonReader reader) => fillMode = reader.Progress(reader.GetString()) switch - { - "stretch" => FillMode.Stretch, - "preserve-aspect-fit" => FillMode.PreserveAspectFit, - _ => throw new JsonException("Invalid fill mode.") - }), + // reader.ProcessJsonObject([ + // new OptionalProperty("version", (ref Utf8JsonReader reader) => version = reader.Progress(reader.GetString())), + // new OptionalProperty("tiledversion", (ref Utf8JsonReader reader) => tiledVersion = reader.Progress(reader.GetString())), + // new OptionalProperty("firstgid", (ref Utf8JsonReader reader) => firstGID = reader.Progress(reader.GetUInt32())), + // new OptionalProperty("source", (ref Utf8JsonReader reader) => source = reader.Progress(reader.GetString())), + // new OptionalProperty("name", (ref Utf8JsonReader reader) => name = reader.Progress(reader.GetString())), + // new OptionalProperty("class", (ref Utf8JsonReader reader) => @class = reader.Progress(reader.GetString() ?? ""), allowNull: true), + // new OptionalProperty("tilewidth", (ref Utf8JsonReader reader) => tileWidth = reader.Progress(reader.GetUInt32())), + // new OptionalProperty("tileheight", (ref Utf8JsonReader reader) => tileHeight = reader.Progress(reader.GetUInt32())), + // new OptionalProperty("spacing", (ref Utf8JsonReader reader) => spacing = reader.Progress(reader.GetUInt32())), + // new OptionalProperty("margin", (ref Utf8JsonReader reader) => margin = reader.Progress(reader.GetUInt32())), + // new OptionalProperty("tilecount", (ref Utf8JsonReader reader) => tileCount = reader.Progress(reader.GetUInt32())), + // new OptionalProperty("columns", (ref Utf8JsonReader reader) => columns = reader.Progress(reader.GetUInt32())), + // new OptionalProperty("objectalignment", (ref Utf8JsonReader reader) => objectAlignment = reader.Progress(reader.GetString()) switch + // { + // "unspecified" => ObjectAlignment.Unspecified, + // "topleft" => ObjectAlignment.TopLeft, + // "top" => ObjectAlignment.Top, + // "topright" => ObjectAlignment.TopRight, + // "left" => ObjectAlignment.Left, + // "center" => ObjectAlignment.Center, + // "right" => ObjectAlignment.Right, + // "bottomleft" => ObjectAlignment.BottomLeft, + // "bottom" => ObjectAlignment.Bottom, + // "bottomright" => ObjectAlignment.BottomRight, + // _ => throw new JsonException("Invalid object alignment.") + // }), + // new OptionalProperty("fillmode", (ref Utf8JsonReader reader) => fillMode = reader.Progress(reader.GetString()) switch + // { + // "stretch" => FillMode.Stretch, + // "preserve-aspect-fit" => FillMode.PreserveAspectFit, + // _ => throw new JsonException("Invalid fill mode.") + // }), - new OptionalProperty("image", (ref Utf8JsonReader reader) => image = reader.Progress(reader.GetString())), - new OptionalProperty("imagewidth", (ref Utf8JsonReader reader) => imageWidth = reader.Progress(reader.GetUInt32())), - new OptionalProperty("imageheight", (ref Utf8JsonReader reader) => imageHeight = reader.Progress(reader.GetUInt32())), + // new OptionalProperty("image", (ref Utf8JsonReader reader) => image = reader.Progress(reader.GetString())), + // new OptionalProperty("imagewidth", (ref Utf8JsonReader reader) => imageWidth = reader.Progress(reader.GetUInt32())), + // new OptionalProperty("imageheight", (ref Utf8JsonReader reader) => imageHeight = reader.Progress(reader.GetUInt32())), - new OptionalProperty("properties", (ref Utf8JsonReader reader) => properties = ReadProperties(ref reader)) - ], "tileset"); + // new OptionalProperty("properties", (ref Utf8JsonReader reader) => properties = ReadProperties(ref reader)) + // ], "tileset"); - Image? imageInstance = image is not null ? new Image - { - Format = ParseImageFormatFromSource(image), - Width = imageWidth, - Height = imageHeight, - Source = image - } : null; + // Image? imageInstance = image is not null ? new Image + // { + // Format = ParseImageFormatFromSource(image), + // Width = imageWidth, + // Height = imageHeight, + // Source = image + // } : null; - return new Tileset - { - Version = version, - TiledVersion = tiledVersion, - FirstGID = firstGID, - Source = source, - Name = name, - Class = @class, - TileWidth = tileWidth, - TileHeight = tileHeight, - Spacing = spacing, - Margin = margin, - TileCount = tileCount, - Columns = columns, - ObjectAlignment = objectAlignment, - FillMode = fillMode, - Image = imageInstance, - Properties = properties - }; - } + // return new Tileset + // { + // Version = version, + // TiledVersion = tiledVersion, + // FirstGID = firstGID, + // Source = source, + // Name = name, + // Class = @class, + // TileWidth = tileWidth, + // TileHeight = tileHeight, + // Spacing = spacing, + // Margin = margin, + // TileCount = tileCount, + // Columns = columns, + // ObjectAlignment = objectAlignment, + // FillMode = fillMode, + // Image = imageInstance, + // Properties = properties + // }; + // } - private static ImageFormat ParseImageFormatFromSource(string? source) - { - if (source is null) - throw new JsonException("Image source is required to determine image format."); + // private static ImageFormat ParseImageFormatFromSource(string? source) + // { + // if (source is null) + // throw new JsonException("Image source is required to determine image format."); - var extension = Path.GetExtension(source); - return extension switch - { - ".png" => ImageFormat.Png, - ".jpg" => ImageFormat.Jpg, - ".jpeg" => ImageFormat.Jpg, - ".gif" => ImageFormat.Gif, - ".bmp" => ImageFormat.Bmp, - _ => throw new JsonException("Invalid image format.") - }; - } + // var extension = Path.GetExtension(source); + // return extension switch + // { + // ".png" => ImageFormat.Png, + // ".jpg" => ImageFormat.Jpg, + // ".jpeg" => ImageFormat.Jpg, + // ".gif" => ImageFormat.Gif, + // ".bmp" => ImageFormat.Bmp, + // _ => throw new JsonException("Invalid image format.") + // }; + // } } diff --git a/DotTiled/Serialization/Tmj/TmjMapReader.cs b/DotTiled/Serialization/Tmj/TmjMapReader.cs index 42919d6..4a113b1 100644 --- a/DotTiled/Serialization/Tmj/TmjMapReader.cs +++ b/DotTiled/Serialization/Tmj/TmjMapReader.cs @@ -17,16 +17,9 @@ public class TmjMapReader : IMapReader public Map ReadMap() { - var bytes = Encoding.UTF8.GetBytes(_jsonString); - var options = new JsonReaderOptions - { - AllowTrailingCommas = true, - CommentHandling = JsonCommentHandling.Skip, - }; - var reader = new Utf8JsonReader(bytes, options); - reader.MoveToContent(); - - return Tmj.ReadMap(ref reader); + var jsonDoc = JsonDocument.Parse(_jsonString); + var rootElement = jsonDoc.RootElement; + return Tmj.ReadMap(rootElement); } protected virtual void Dispose(bool disposing)