2using Newtonsoft.Json.Linq;
8internal sealed class SceneLayerTileArrayConverter : JsonConverter<SceneLayerTile[,]>
11 public override SceneLayerTile[,] ReadJson(JsonReader reader, Type objectType, SceneLayerTile[,]? existingValue,
12 bool hasExistingValue, JsonSerializer serializer)
14 var token = JToken.Load(reader);
15 var rows = (JArray)(token is JObject obj ? obj[
"$values"]! : token);
16 int height = rows.Count == 0 ? 0 : ((JArray)rows[0]).Count;
17 var result =
new SceneLayerTile[rows.Count, height];
18 if (token is JObject envelope && envelope.Value<
string>(
"$id") is { }
id)
19 serializer.ReferenceResolver!.AddReference(serializer,
id, result);
20 for (
int x = 0; x < rows.Count; x++)
22 if (rows[x] is not JArray column || column.Count != height)
23 throw new JsonSerializationException(
"SceneLayerTileArray must be rectangular.");
24 for (
int y = 0; y < height; y++)
25 result[x, y] = column[y].ToObject<SceneLayerTile>(serializer)!;
31 public override bool CanWrite =>
false;
33 public override void WriteJson(JsonWriter writer, SceneLayerTile[,]? value, JsonSerializer serializer) =>
34 throw new NotSupportedException();