diff --git a/packages/Realtime/Realtime.Tests/Serialization/ArrayConverterTests.cs b/packages/Realtime/Realtime.Tests/Serialization/ArrayConverterTests.cs index b9612dfc..c92f48c3 100644 --- a/packages/Realtime/Realtime.Tests/Serialization/ArrayConverterTests.cs +++ b/packages/Realtime/Realtime.Tests/Serialization/ArrayConverterTests.cs @@ -140,6 +140,18 @@ public void NestedIntArrayRead_ShouldReturnNullAndKeepReading_GivenAJsonObject() Coerce("""{"nestedIntArray":{},"stringArray":"{ok}"}""") .Should().BeEquivalentTo(new { NestedIntArray = (List>?) null, StringArray = new[] { "ok" } }); + [TestMethod] + [DataRow("""{"intArray":[1,"x"],"stringArray":"{ok}"}""")] + [DataRow("""{"intArray":{},"stringArray":"{ok}"}""")] + public void IntArrayRead_ShouldReturnNullAndKeepReading_GivenABadJsonValue(string json) => + Coerce(json).Should().BeEquivalentTo(new { IntArray = (List?) null, StringArray = new[] { "ok" } }); + + [TestMethod] + [DataRow("""{"stringArray":["a",1],"intArray":"{1}"}""")] + [DataRow("""{"stringArray":{},"intArray":"{1}"}""")] + public void StringArrayRead_ShouldReturnNullAndKeepReading_GivenABadJsonValue(string json) => + Coerce(json).Should().BeEquivalentTo(new { StringArray = (List?) null, IntArray = new[] { 1 } }); + [TestMethod] public void IntArrayRead_ShouldReturnNull_GivenDeeplyNestedBraces() => Coerce(JsonSerializer.Serialize(new { intArray = new string('{', 100_000) })).IntArray.Should().BeNull(); diff --git a/packages/Realtime/Realtime/Converters/IntArrayConverter.cs b/packages/Realtime/Realtime/Converters/IntArrayConverter.cs index dd7eba3f..df49489d 100644 --- a/packages/Realtime/Realtime/Converters/IntArrayConverter.cs +++ b/packages/Realtime/Realtime/Converters/IntArrayConverter.cs @@ -18,6 +18,7 @@ public class IntArrayConverter : JsonConverter> /// public override List? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { + var start = reader; try { switch (reader.TokenType) @@ -32,11 +33,14 @@ public class IntArrayConverter : JsonConverter> list.Add(reader.GetInt32()); return list; default: + reader.Skip(); return null; } } catch { + reader = start; + reader.Skip(); return null; } } diff --git a/packages/Realtime/Realtime/Converters/PostgresNestedArrayConverter.cs b/packages/Realtime/Realtime/Converters/PostgresNestedArrayConverter.cs index f8214100..8db523c0 100644 --- a/packages/Realtime/Realtime/Converters/PostgresNestedArrayConverter.cs +++ b/packages/Realtime/Realtime/Converters/PostgresNestedArrayConverter.cs @@ -73,7 +73,7 @@ private class NestedConverter : JsonConverter> case JsonTokenType.StartArray: var list = new List(); while (reader.Read() && reader.TokenType != JsonTokenType.EndArray) - list.Add(JsonSerializer.Deserialize(ref reader, options)!); + list.Add(JsonSerializer.Deserialize(ref reader, options) ?? throw new JsonException()); return list; default: reader.Skip(); diff --git a/packages/Realtime/Realtime/Converters/StringArrayConverter.cs b/packages/Realtime/Realtime/Converters/StringArrayConverter.cs index 23a1b6ab..a71a5873 100644 --- a/packages/Realtime/Realtime/Converters/StringArrayConverter.cs +++ b/packages/Realtime/Realtime/Converters/StringArrayConverter.cs @@ -18,6 +18,7 @@ public class StringArrayConverter : JsonConverter> /// public override List? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { + var start = reader; try { switch (reader.TokenType) @@ -32,11 +33,14 @@ public class StringArrayConverter : JsonConverter> list.Add(reader.GetString()!); return list; default: + reader.Skip(); return null; } } catch { + reader = start; + reader.Skip(); return null; } }