public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            var filter = new GeoBoundingBoxFilterDescriptor();
            IGeoBoundingBoxFilter f = filter;

            if (reader.TokenType != JsonToken.StartObject)
            {
                return(null);
            }

            var depth = reader.Depth;

            while (reader.Read() && reader.Depth >= depth && reader.Value != null)
            {
                var property = reader.Value as string;
                switch (property)
                {
                case "_cache":
                    reader.Read();
                    f.Cache = reader.Value as bool?;
                    break;

                case "_name":
                    reader.Read();
                    f.FilterName = reader.Value as string;
                    break;

                case "_cache_key":
                    reader.Read();
                    f.CacheKey = reader.Value as string;
                    break;

                case "type":
                    reader.Read();
                    f.GeoExecution = (reader.Value as string).ToEnum <GeoExecution>();
                    break;

                default:
                    f.Field = property;
                    ReadBox(f, reader);
                    break;
                }
            }
            return(filter);
        }
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            var filter = new GeoBoundingBoxFilterDescriptor();
            IGeoBoundingBoxFilter f = filter;
            if (reader.TokenType != JsonToken.StartObject)
                return null;

            var depth = reader.Depth;
            while (reader.Read() && reader.Depth >= depth && reader.Value != null)
            {
                var property = reader.Value as string;
                switch(property)
                {
                    case "_cache":
                        reader.Read();
                        f.Cache = reader.Value as bool?;
                        break;
                    case "_name":
                        reader.Read();
                        f.FilterName = reader.Value as string;
                        break;
                    case "_cache_key":
                        reader.Read();
                        f.CacheKey = reader.Value as string;
                        break;
                    case "type":
                        reader.Read();
                        f.GeoExecution = Enum.Parse(typeof(GeoExecution), reader.Value as string) as GeoExecution?;
                        break;
                    default:
                        f.Field = property;
                        ReadBox(f, reader);
                        break;
                }
            }
            return filter;
        }