public IRangeQuery Deserialize(ref JsonReader reader, IJsonFormatterResolver formatterResolver) { if (reader.ReadIsNull()) { return(null); } var segment = reader.ReadNextBlockSegment(); var segmentReader = new JsonReader(segment.Array, segment.Offset); var isLong = false; var isDate = false; var isDouble = false; var count = 0; while (segmentReader.ReadIsInObject(ref count)) { segmentReader.ReadPropertyNameSegmentRaw(); var innerCount = 0; while (segmentReader.ReadIsInObject(ref innerCount)) { var innerPropertyName = segmentReader.ReadPropertyNameSegmentRaw(); if (RangeFields.TryGetValue(innerPropertyName, out var innerValue)) { switch (innerValue) { case 0: case 1: isDate = true; break; case 2: case 3: case 4: case 5: var token = segmentReader.GetCurrentJsonToken(); switch (token) { case JsonToken.String: case JsonToken.Null: if (!isDate) { var valueSegment = segmentReader.ReadStringSegmentUnsafe(); isDate = valueSegment.IsDateTime(formatterResolver, out _) || valueSegment.ContainsDateMathSeparator() && DateMath.IsValidDateMathString(valueSegment.Utf8String()); } break; case JsonToken.Number: if (!isDouble) { var numberSegment = segmentReader.ReadNumberSegment(); if (numberSegment.IsDouble()) { isDouble = true; } else { isLong = true; } } break; } break; } } else { segmentReader.ReadNextBlock(); } if (isDate || isDouble) { break; } } if (isDate || isDouble) { break; } } segmentReader = new JsonReader(segment.Array, segment.Offset); if (isDate) { return(Deserialize <IDateRangeQuery>(ref segmentReader, formatterResolver)); } if (isDouble) { return(Deserialize <INumericRangeQuery>(ref segmentReader, formatterResolver)); } if (isLong) { return(Deserialize <ILongRangeQuery>(ref segmentReader, formatterResolver)); } return(Deserialize <ITermRangeQuery>(ref segmentReader, formatterResolver)); }