diff --git a/src/NetTopologySuite.IO.GeoJSON4STJ/Converters/StjFeatureCollectionConverter.cs b/src/NetTopologySuite.IO.GeoJSON4STJ/Converters/StjFeatureCollectionConverter.cs index 514070a..828ec78 100644 --- a/src/NetTopologySuite.IO.GeoJSON4STJ/Converters/StjFeatureCollectionConverter.cs +++ b/src/NetTopologySuite.IO.GeoJSON4STJ/Converters/StjFeatureCollectionConverter.cs @@ -65,7 +65,7 @@ public override FeatureCollection Read(ref Utf8JsonReader reader, Type objectTyp else { reader.ReadOrThrow(); - reader.Skip(); + reader.SkipOrThrow(); reader.ReadOrThrow(); } } diff --git a/src/NetTopologySuite.IO.GeoJSON4STJ/Converters/StjFeatureConverter.cs b/src/NetTopologySuite.IO.GeoJSON4STJ/Converters/StjFeatureConverter.cs index 5c2bcda..df1e947 100644 --- a/src/NetTopologySuite.IO.GeoJSON4STJ/Converters/StjFeatureConverter.cs +++ b/src/NetTopologySuite.IO.GeoJSON4STJ/Converters/StjFeatureConverter.cs @@ -162,7 +162,7 @@ public override IFeature Read(ref Utf8JsonReader reader, Type objectType, JsonSe default: // If property name is not one of the above: skip it entirely (foreign member) - reader.Skip(); + reader.SkipOrThrow(); // Advance while (reader.Read()) { diff --git a/src/NetTopologySuite.IO.GeoJSON4STJ/Converters/StjGeometryConverter.cs b/src/NetTopologySuite.IO.GeoJSON4STJ/Converters/StjGeometryConverter.cs index e5d4c1a..eba3089 100644 --- a/src/NetTopologySuite.IO.GeoJSON4STJ/Converters/StjGeometryConverter.cs +++ b/src/NetTopologySuite.IO.GeoJSON4STJ/Converters/StjGeometryConverter.cs @@ -96,7 +96,7 @@ public override Geometry Read(ref Utf8JsonReader reader, Type typeToConvert, Jso break; default: // included "bbox" property //read, but can't do anything with it (see NetTopologySuite.IO.GeoJSON => NetTopologySuite.IO.Converters.GeometryConverter.ParseGeometry) - reader.Skip(); + reader.SkipOrThrow(); reader.Read(); break; } @@ -248,7 +248,7 @@ public override void Write(Utf8JsonWriter writer, Geometry value, JsonSerializer private void WritePolygon(Utf8JsonWriter writer, Polygon value, JsonSerializerOptions options) { - + writer.WriteStartArray(); WriteCoordinateSequence(writer, value.ExteriorRing.CoordinateSequence, options, orientation:_oriExterior); for (int i = 0; i < value.NumInteriorRings; i++) diff --git a/src/NetTopologySuite.IO.GeoJSON4STJ/Converters/Utility.cs b/src/NetTopologySuite.IO.GeoJSON4STJ/Converters/Utility.cs index 52829e0..254915c 100644 --- a/src/NetTopologySuite.IO.GeoJSON4STJ/Converters/Utility.cs +++ b/src/NetTopologySuite.IO.GeoJSON4STJ/Converters/Utility.cs @@ -61,6 +61,15 @@ internal static void AssertToken(this ref Utf8JsonReader reader, JsonTokenType r } } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal static void SkipOrThrow(this ref Utf8JsonReader reader) + { + if (!reader.TrySkip()) + { + ThrowForUnexpectedPartialJson(); + } + } + internal static object ObjectFromJsonNode(JsonNode node, JsonSerializerOptions serializerOptions) { switch (node) @@ -93,6 +102,10 @@ internal static JsonNode ObjectToJsonNode(object obj, JsonSerializerOptions seri private static void ThrowForUnexpectedEndOfStream() => throw new JsonException(Resources.EX_UnexpectedEndOfStream); + [MethodImpl(MethodImplOptions.NoInlining)] + private static void ThrowForUnexpectedPartialJson() + => throw new JsonException(Resources.EX_UnexpectedPartialJson); + [MethodImpl(MethodImplOptions.NoInlining)] private static void ThrowForUnexpectedToken(JsonTokenType requiredNextTokenType, ref Utf8JsonReader reader) => throw new JsonException(string.Format(Resources.EX_UnexpectedToken, requiredNextTokenType, reader.TokenType, CurrentTokenAsString(in reader))); diff --git a/src/NetTopologySuite.IO.GeoJSON4STJ/Properties/Resources.Designer.cs b/src/NetTopologySuite.IO.GeoJSON4STJ/Properties/Resources.Designer.cs index 46224fc..36acb56 100644 --- a/src/NetTopologySuite.IO.GeoJSON4STJ/Properties/Resources.Designer.cs +++ b/src/NetTopologySuite.IO.GeoJSON4STJ/Properties/Resources.Designer.cs @@ -131,5 +131,14 @@ internal static string EX_UnexpectedToken { return ResourceManager.GetString("EX_UnexpectedToken", resourceCulture); } } + + /// + /// Looks up a localized string similar to JsonConverter received partial JSON. This is likely the result of a bug in the System.Text.Json library.. + /// + internal static string EX_UnexpectedPartialJson { + get { + return ResourceManager.GetString("EX_UnexpectedPartialJson", resourceCulture); + } + } } } diff --git a/src/NetTopologySuite.IO.GeoJSON4STJ/Properties/Resources.resx b/src/NetTopologySuite.IO.GeoJSON4STJ/Properties/Resources.resx index d0f48e0..ca2b5de 100644 --- a/src/NetTopologySuite.IO.GeoJSON4STJ/Properties/Resources.resx +++ b/src/NetTopologySuite.IO.GeoJSON4STJ/Properties/Resources.resx @@ -141,4 +141,7 @@ Expected token is '{0}' but was '{1}' (Value '{2}'). - \ No newline at end of file + + JsonConverter received partial JSON. This is likely the result of a bug in the System.Text.Json library. + +