Skip to content

Commit 3c29552

Browse files
committed
2 parents 959e6c3 + 5860d1f commit 3c29552

File tree

8 files changed

+215
-144
lines changed

8 files changed

+215
-144
lines changed

NetTopologySuite.IO/NetTopologySuite.IO.GeoJSON/Converters/AttributesTableConverter.cs

+5
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,10 @@ private static object InternalReadJson(JsonReader reader, JsonSerializer seriali
131131
{
132132
// inner object
133133
attributeValue = InternalReadJson(reader, serializer);
134+
if (reader.TokenType != JsonToken.EndObject)
135+
throw new ArgumentException("Expected token '}' not found.");
136+
// read EndObject token
137+
reader.Read();
134138
}
135139
else if (reader.TokenType == JsonToken.StartArray)
136140
{
@@ -155,6 +159,7 @@ private static object InternalReadJson(JsonReader reader, JsonSerializer seriali
155159
// TODO: refactor to remove check when reading TopoJSON
156160
if (reader.TokenType != JsonToken.EndObject)
157161
throw new ArgumentException("Expected token '}' not found.");
162+
158163
return attributesTable;
159164
}
160165

NetTopologySuite.IO/NetTopologySuite.IO.GeoJSON/Converters/FeatureCollectionConverter.cs

+5
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,18 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist
5656
string val = (string)reader.Value;
5757
if (val == "features")
5858
{
59+
// move to begin of array
5960
reader.Read();
6061
if (reader.TokenType != JsonToken.StartArray)
6162
throw new ArgumentException("Expected token '[' not found.");
6263

64+
// move to first feature
6365
reader.Read();
6466
while (reader.TokenType != JsonToken.EndArray)
67+
{
6568
fc.Add(serializer.Deserialize<Feature>(reader));
69+
reader.Read();
70+
}
6671
reader.Read();
6772
continue;
6873
}

NetTopologySuite.IO/NetTopologySuite.IO.GeoJSON/Converters/FeatureConverter.cs

+7-3
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s
7272
/// </returns>
7373
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
7474
{
75+
if (reader.TokenType != JsonToken.StartObject)
76+
throw new JsonReaderException("Expected Start object '{' Token");
77+
7578
bool read = reader.Read();
7679
object featureId = null;
7780
Feature feature = new Feature();
@@ -136,9 +139,10 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist
136139
}
137140

138141
if (read && reader.TokenType != JsonToken.EndObject)
139-
throw new ArgumentException("Expected token '}' not found.");
140-
read = reader.Read(); // move next
141-
142+
throw new ArgumentException("Expected token '}' not found.");
143+
144+
//read = reader.Read(); // move next
145+
142146
IAttributesTable attributes = feature.Attributes;
143147
if (attributes != null)
144148
{
Original file line numberDiff line numberDiff line change
@@ -1,139 +1,142 @@
1-
using System;
2-
using System.Collections.Generic;
3-
using GeoAPI.Geometries;
4-
using NetTopologySuite.Features;
5-
using Newtonsoft.Json;
6-
7-
namespace NetTopologySuite.IO.Converters
8-
{
9-
public class TopoFeatureConverter : CoordinateConverter
10-
{
11-
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
12-
{
13-
if (writer == null)
14-
throw new ArgumentNullException("writer");
15-
if (value == null)
16-
throw new ArgumentNullException("value");
17-
if (serializer == null)
18-
throw new ArgumentNullException("serializer");
19-
if (!(value is IFeature))
20-
{
21-
string s = String.Format("IFeature expected but was {0}", value.GetType().Name);
22-
throw new ArgumentException(s);
23-
}
24-
25-
writer.WriteStartObject();
26-
writer.WritePropertyName("type");
27-
writer.WriteValue("Topology");
28-
29-
writer.WritePropertyName("objects");
30-
writer.WriteStartObject();
31-
writer.WritePropertyName("data");
32-
IEnumerable<Coordinate[]> arcs = WriteFeature(writer, serializer, (IFeature)value);
33-
writer.WriteEndObject();
34-
35-
WriteArcs(writer, serializer, arcs);
36-
writer.WriteEndObject();
37-
}
38-
39-
private IEnumerable<Coordinate[]> WriteFeature(JsonWriter writer, JsonSerializer serializer, IFeature feature)
40-
{
41-
if (writer == null)
42-
throw new ArgumentNullException("writer");
43-
if (serializer == null)
44-
throw new ArgumentNullException("serializer");
45-
if (feature == null)
46-
throw new ArgumentNullException("feature");
47-
48-
Coordinate[][] arcs;
49-
writer.WriteStartObject();
50-
IGeometry geom = feature.Geometry;
51-
writer.WritePropertyName("type");
52-
writer.WriteValue(geom.GeometryType);
53-
OgcGeometryType type = geom.OgcGeometryType;
54-
switch (type)
55-
{
56-
case OgcGeometryType.Point:
57-
WriteGeom(writer, serializer, (IPoint)geom);
58-
arcs = null;
59-
break;
60-
case OgcGeometryType.LineString:
61-
arcs = WriteGeom(writer, (ILineString)geom);
62-
break;
63-
case OgcGeometryType.Polygon:
64-
arcs = WriteGeom(writer, (IPolygon)geom);
65-
break;
66-
default:
67-
string err = String.Format("type unsupported: {0}", type);
68-
throw new ArgumentOutOfRangeException(err);
69-
}
70-
serializer.Serialize(writer, feature.Attributes);
71-
writer.WriteEndObject();
72-
return arcs;
73-
}
74-
75-
private void WriteGeom(JsonWriter writer, JsonSerializer serializer, IPoint pt)
76-
{
77-
if (pt == null)
78-
throw new ArgumentNullException("pt");
79-
80-
writer.WritePropertyName("coordinates");
81-
WriteJsonCoordinate(writer, pt.Coordinate, serializer);
82-
}
83-
84-
private Coordinate[][] WriteGeom(JsonWriter writer, ILineString ls)
85-
{
86-
if (ls == null)
87-
throw new ArgumentNullException("ls");
88-
89-
writer.WritePropertyName("arcs");
90-
writer.WriteStartArray();
91-
writer.WriteValue(0);
92-
writer.WriteEndArray();
93-
return new[] { ls.Coordinates };
94-
}
95-
96-
private Coordinate[][] WriteGeom(JsonWriter writer, IPolygon poly)
97-
{
98-
if (poly == null)
99-
throw new ArgumentNullException("poly");
100-
101-
int numHoles = poly.NumInteriorRings;
102-
Coordinate[][] arr = new Coordinate[numHoles + 1][];
103-
writer.WritePropertyName("arcs");
104-
writer.WriteStartArray();
105-
writer.WriteStartArray();
106-
// shell
107-
writer.WriteValue(0);
108-
arr[0] = poly.Shell.Coordinates;
109-
// holes
110-
for (int i = 0; i < numHoles; i++)
111-
{
112-
writer.WriteValue(i + 1);
113-
arr[i + 1] = poly.GetInteriorRingN(i).Coordinates;
114-
}
115-
writer.WriteEndArray();
116-
writer.WriteEndArray();
117-
return arr;
118-
}
119-
120-
private void WriteArcs(JsonWriter writer, JsonSerializer serializer, IEnumerable<Coordinate[]> arcs)
121-
{
122-
if (arcs == null)
123-
return;
124-
125-
writer.WritePropertyName("arcs");
126-
WriteJsonCoordinatesEnumerable(writer, arcs, serializer);
127-
}
128-
129-
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
130-
{
131-
throw new NotSupportedException("used only in serialization");
132-
}
133-
134-
public override bool CanConvert(Type objectType)
135-
{
136-
return typeof(IFeature).IsAssignableFrom(objectType);
137-
}
138-
}
1+
using System;
2+
using System.Collections.Generic;
3+
using GeoAPI.Geometries;
4+
using NetTopologySuite.Features;
5+
using Newtonsoft.Json;
6+
7+
namespace NetTopologySuite.IO.Converters
8+
{
9+
public class TopoFeatureConverter : CoordinateConverter
10+
{
11+
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
12+
{
13+
if (writer == null)
14+
throw new ArgumentNullException("writer");
15+
if (value == null)
16+
throw new ArgumentNullException("value");
17+
if (serializer == null)
18+
throw new ArgumentNullException("serializer");
19+
if (!(value is IFeature))
20+
{
21+
string s = String.Format("IFeature expected but was {0}", value.GetType().Name);
22+
throw new ArgumentException(s);
23+
}
24+
25+
writer.WriteStartObject();
26+
writer.WritePropertyName("type");
27+
writer.WriteValue("Topology");
28+
29+
writer.WritePropertyName("objects");
30+
writer.WriteStartObject();
31+
writer.WritePropertyName("data");
32+
IEnumerable<Coordinate[]> arcs = WriteFeature(writer, serializer, (IFeature)value);
33+
writer.WriteEndObject();
34+
35+
WriteArcs(writer, serializer, arcs);
36+
writer.WriteEndObject();
37+
}
38+
39+
private IEnumerable<Coordinate[]> WriteFeature(JsonWriter writer, JsonSerializer serializer, IFeature feature)
40+
{
41+
if (writer == null)
42+
throw new ArgumentNullException("writer");
43+
if (serializer == null)
44+
throw new ArgumentNullException("serializer");
45+
if (feature == null)
46+
throw new ArgumentNullException("feature");
47+
48+
Coordinate[][] arcs;
49+
writer.WriteStartObject();
50+
IGeometry geom = feature.Geometry;
51+
writer.WritePropertyName("type");
52+
writer.WriteValue(geom.GeometryType);
53+
OgcGeometryType type = geom.OgcGeometryType;
54+
switch (type)
55+
{
56+
case OgcGeometryType.Point:
57+
WriteGeom(writer, serializer, (IPoint)geom);
58+
arcs = null;
59+
break;
60+
case OgcGeometryType.LineString:
61+
arcs = WriteGeom(writer, (ILineString)geom);
62+
break;
63+
case OgcGeometryType.Polygon:
64+
arcs = WriteGeom(writer, (IPolygon)geom);
65+
break;
66+
default:
67+
string err = String.Format("type unsupported: {0}", type);
68+
throw new ArgumentOutOfRangeException(err);
69+
}
70+
// properties
71+
writer.WritePropertyName("properties");
72+
serializer.Serialize(writer, feature.Attributes);
73+
74+
writer.WriteEndObject();
75+
return arcs;
76+
}
77+
78+
private void WriteGeom(JsonWriter writer, JsonSerializer serializer, IPoint pt)
79+
{
80+
if (pt == null)
81+
throw new ArgumentNullException("pt");
82+
83+
writer.WritePropertyName("coordinates");
84+
WriteJsonCoordinate(writer, pt.Coordinate, serializer);
85+
}
86+
87+
private Coordinate[][] WriteGeom(JsonWriter writer, ILineString ls)
88+
{
89+
if (ls == null)
90+
throw new ArgumentNullException("ls");
91+
92+
writer.WritePropertyName("arcs");
93+
writer.WriteStartArray();
94+
writer.WriteValue(0);
95+
writer.WriteEndArray();
96+
return new[] { ls.Coordinates };
97+
}
98+
99+
private Coordinate[][] WriteGeom(JsonWriter writer, IPolygon poly)
100+
{
101+
if (poly == null)
102+
throw new ArgumentNullException("poly");
103+
104+
int numHoles = poly.NumInteriorRings;
105+
Coordinate[][] arr = new Coordinate[numHoles + 1][];
106+
writer.WritePropertyName("arcs");
107+
writer.WriteStartArray();
108+
writer.WriteStartArray();
109+
// shell
110+
writer.WriteValue(0);
111+
arr[0] = poly.Shell.Coordinates;
112+
// holes
113+
for (int i = 0; i < numHoles; i++)
114+
{
115+
writer.WriteValue(i + 1);
116+
arr[i + 1] = poly.GetInteriorRingN(i).Coordinates;
117+
}
118+
writer.WriteEndArray();
119+
writer.WriteEndArray();
120+
return arr;
121+
}
122+
123+
private void WriteArcs(JsonWriter writer, JsonSerializer serializer, IEnumerable<Coordinate[]> arcs)
124+
{
125+
if (arcs == null)
126+
return;
127+
128+
writer.WritePropertyName("arcs");
129+
WriteJsonCoordinatesEnumerable(writer, arcs, serializer);
130+
}
131+
132+
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
133+
{
134+
throw new NotSupportedException("used only in serialization");
135+
}
136+
137+
public override bool CanConvert(Type objectType)
138+
{
139+
return typeof(IFeature).IsAssignableFrom(objectType);
140+
}
141+
}
139142
}

NetTopologySuite.IO/NetTopologySuite.IO.TopoJSON/Converters/TopoObjectConverter.cs

+2
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist
4444
type = ReadType(reader);
4545
break;
4646
case "properties":
47+
reader.Read();
4748
properties = serializer.Deserialize<IAttributesTable>(reader);
49+
reader.Read();
4850
break;
4951
case "coordinates":
5052
coordinates = ReadPoints(reader, serializer);

NetTopologySuite.Samples.Console/NetTopologySuite.Samples.Console.csproj

+1
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@
122122
<Compile Include="Tests\Github\Issue61Fixture.cs" />
123123
<Compile Include="Tests\Github\Issue62Fixture.cs" />
124124
<Compile Include="Tests\Github\Issue87Fixture.cs" />
125+
<Compile Include="Tests\Github\Issue96Fixture.cs" />
125126
<Compile Include="Tests\IO\GmlTest.cs" />
126127
<Compile Include="Tests\Github\Issue36Tests.cs" />
127128
<Compile Include="Tests\IO\PostGisTest.cs" />

0 commit comments

Comments
 (0)