public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            while (reader.TokenType != JsonToken.StartObject)
            {
                reader.Read();
            }

            reader.Read();

            var op = reader.Value.ToString();

            // reader.Read();
            switch (op)
            {
            case "and":
            case "or":
                reader.Read();
                var combined = new CombinedFilterExpression {
                    Operator = (CombinationOperator)Enum.Parse(typeof(CombinationOperator), char.ToUpper(op[0]) + op.Substring(1))
                };
                var combineitem = ProcessCombinedExpression(combined, reader, serializer);
                return(combineitem);

            default:
                var comparison = new ComparisonFilterExpression {
                    Operator = GetComparison(op)
                };
                var compareitem = ProcessComparisonFilter(comparison, reader, serializer);
                return(compareitem);
            }
        }
        private CombinedFilterExpression ProcessCombinedExpression(CombinedFilterExpression expression, JsonReader reader, JsonSerializer serializer)
        {
            reader.Read(); // Start Array
            var list = new List <FilterExpression>();

            while (reader.TokenType != JsonToken.EndArray)
            {
                var filter = serializer.Deserialize <FilterExpression>(reader);
                list.Add(filter);
                if (reader.TokenType == JsonToken.EndObject)
                {
                    reader.Read();
                }
            }

            expression.Filters = list.ToArray();
            while (reader.TokenType != JsonToken.EndObject)
            {
                reader.Read(); //End Array
            }
            return(expression);
        }