/// <summary> /// Reads the json and converts to appropriate Geometry class using the 'type' field as an indicator /// to which object it should be deserialized back to /// </summary> /// <param name="reader"></param> /// <param name="objectType"></param> /// <param name="existingValue"></param> /// <param name="serializer"></param> /// <returns></returns> public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { JObject Token = JObject.Load(reader); if (!Token.TryGetValue("type", StringComparison.OrdinalIgnoreCase, out JToken TypeToken)) { throw new JsonReaderException("Invalid geojson geometry object, does not have 'type' field."); } Type ActualType = Geometry.GetType(TypeToken.ToObject <GeoJsonType>(serializer)); if (existingValue == null || existingValue.GetType() != ActualType) { return(Token.ToObject(ActualType, serializer)); } else { using (JsonReader DerivedTypeReader = Token.CreateReader()) { serializer.Populate(DerivedTypeReader, existingValue); } return(existingValue); } }
/// <summary> /// Reads the json and converts to appropriate GeoJson class using the 'type' field as an indicator /// to which object it should be deserialized back to /// </summary> /// <param name="reader"></param> /// <param name="objectType"></param> /// <param name="existingValue"></param> /// <param name="serializer"></param> /// <returns></returns> public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { // Allow an abstract GeoJson to be null in deserialization if (reader.TokenType == JsonToken.Null) { return(null); } JObject token = JObject.Load(reader); if (!token.TryGetValue("type", StringComparison.OrdinalIgnoreCase, out JToken TypeToken)) { throw new JsonReaderException("Invalid geojson object, does not have 'type' field."); } Type actualType = GeoJson.GetType(TypeToken.ToObject <GeoJsonType>(serializer)); if (existingValue == null || existingValue.GetType() != actualType) { return((GeoJson)token.ToObject(actualType, serializer)); } else { using (JsonReader derivedTypeReader = token.CreateReader()) { serializer.Populate(derivedTypeReader, existingValue); } return(existingValue); } }
public override GeoJSONObject ReadJson(JsonReader reader, Type objectType, GeoJSONObject existingValue, bool hasExistingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Null) //GeoJSONObject can be abstract { return(null); } JObject token = JObject.Load(reader); if (!token.TryGetValue("type", StringComparison.OrdinalIgnoreCase, out JToken TypeToken)) { throw new JsonReaderException("Invalid geojson object, does not have 'type' field."); } // Match GeoJSONType to actual type GeoJSONType tokenType = TypeToken.ToObject <GeoJSONType>(serializer); Type actualType = tokenType switch { GeoJSONType.Point => typeof(Point), GeoJSONType.LineString => typeof(LineString), GeoJSONType.Polygon => typeof(Polygon), GeoJSONType.Feature => typeof(Feature), GeoJSONType.FeatureCollection => typeof(FeatureCollection), _ => null, //TODO: proper check here }; if (existingValue == null || existingValue.GetType() != actualType) { return((GeoJSONObject)token.ToObject(actualType, serializer)); } else { using (JsonReader derivedTypeReader = token.CreateReader()) { serializer.Populate(derivedTypeReader, existingValue); } return(existingValue); } }