public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            var j = JObject.Load(reader);

            if (j == null || !j.HasValues)
            {
                return(null);
            }
            IRangeFilter filter = new RangeFilterDescriptor <object>();

            foreach (var jv in j)
            {
                switch (jv.Key)
                {
                case "_cache":
                    filter.Cache = jv.Value.Value <bool>();
                    break;

                case "_cache_key":
                    filter.CacheKey = jv.Value.Value <string>();
                    break;

                case "_name":
                    filter.FilterName = jv.Value.Value <string>();
                    break;

                default:
                    filter.Field = jv.Key;

                    var gte = jv.Value["gte"];
                    if (gte != null)
                    {
                        filter.GreaterThanOrEqualTo = ToString(gte);
                    }

                    var gt = jv.Value["gt"];
                    if (gt != null)
                    {
                        filter.GreaterThanOrEqualTo = ToString(gt);
                    }

                    var lte = jv.Value["lte"];
                    if (lte != null)
                    {
                        filter.LowerThanOrEqualTo = ToString(lte);
                    }

                    var lt = jv.Value["lt"];
                    if (lt != null)
                    {
                        filter.LowerThanOrEqualTo = ToString(lt);
                    }

                    break;
                }
            }

            return(filter);
        }
		public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
		{
			var j = JObject.Load(reader);
			if (j == null || !j.HasValues)
				return null;
			IRangeFilter filter = new RangeFilterDescriptor<object>();
			foreach (var jv in j)
			{
				switch (jv.Key)
				{
					case "execution":
						var execution = jv.Value.Value<string>();
						if(!string.IsNullOrEmpty(execution)) filter.Execution = execution.ToEnum<RangeExecution>();
						break;
					case "_cache":
						filter.Cache = jv.Value.Value<bool>();
						break;
					case "_cache_key":
						filter.CacheKey = jv.Value.Value<string>();
						break;
					case "_name":
						filter.FilterName = jv.Value.Value<string>();
						break;
					default:
						filter.Field = jv.Key;
					
						var gte = jv.Value["gte"];
						if (gte != null)
							filter.GreaterThanOrEqualTo = ToString(gte);
						
						var gt = jv.Value["gt"];
						if (gt != null)
							filter.GreaterThanOrEqualTo = ToString(gt);

						var lte = jv.Value["lte"];
						if (lte != null)
							filter.LowerThanOrEqualTo = ToString(lte);
							
						var lt = jv.Value["lt"];
						if (lt != null)
							filter.LowerThanOrEqualTo = ToString(lt);
						
						break;
				}
			}

			return filter;

		}