예제 #1
0
        /// <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);
            }
        }
예제 #2
0
        /// <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);
            }
        }