<PackageReference Include="Newtonsoft.Json" Version="10.0.1" />

BooleanQueryExpression

using Newtonsoft.Json.Utilities; using Newtonsoft.Json.Utilities.LinqBridge; using System; using System.Collections.Generic; using System.Globalization; using System.IO; namespace Newtonsoft.Json.Linq.JsonPath { internal class BooleanQueryExpression : QueryExpression { public object Left { get; set; } public object Right { get; set; } private IEnumerable<JToken> GetResult(JToken root, JToken t, object o) { JToken jToken = o as JToken; if (jToken != null) return new JToken[1] { jToken }; List<PathFilter> list = o as List<PathFilter>; if (list != null) return JPath.Evaluate(list, root, t, false); return CollectionUtils.ArrayEmpty<JToken>(); } public override bool IsMatch(JToken root, JToken t) { if (base.Operator == QueryOperator.Exists) return GetResult(root, t, Left).Any(); using (IEnumerator<JToken> enumerator = GetResult(root, t, Left).GetEnumerator()) { if (enumerator.MoveNext()) { IEnumerable<JToken> result = GetResult(root, t, Right); ICollection<JToken> collection = (result as ICollection<JToken>) ?? result.ToList(); do { JToken current = enumerator.Current; foreach (JToken item in collection) { if (MatchTokens(current, item)) return true; } } while (enumerator.MoveNext()); } } return false; } private bool MatchTokens(JToken leftResult, JToken rightResult) { JValue jValue = leftResult as JValue; JValue jValue2 = rightResult as JValue; if (jValue != null && jValue2 != null) { switch (base.Operator) { case QueryOperator.Equals: if (EqualsWithStringCoercion(jValue, jValue2)) return true; break; case QueryOperator.NotEquals: if (!EqualsWithStringCoercion(jValue, jValue2)) return true; break; case QueryOperator.GreaterThan: if (jValue.CompareTo(jValue2) > 0) return true; break; case QueryOperator.GreaterThanOrEquals: if (jValue.CompareTo(jValue2) >= 0) return true; break; case QueryOperator.LessThan: if (jValue.CompareTo(jValue2) < 0) return true; break; case QueryOperator.LessThanOrEquals: if (jValue.CompareTo(jValue2) <= 0) return true; break; case QueryOperator.Exists: return true; } } else { QueryOperator operator = base.Operator; if (operator == QueryOperator.NotEquals || operator == QueryOperator.Exists) return true; } return false; } private bool EqualsWithStringCoercion(JValue value, JValue queryValue) { if (value.Equals(queryValue)) return true; if (queryValue.Type != JTokenType.String) return false; string b = (string)queryValue.Value; string a = default(string); switch (value.Type) { case JTokenType.Date: using (StringWriter stringWriter = StringUtils.CreateStringWriter(64)) { DateTimeUtils.WriteDateTimeString(stringWriter, (DateTime)value.Value, DateFormatHandling.IsoDateFormat, null, CultureInfo.InvariantCulture); a = stringWriter.ToString(); } break; case JTokenType.Bytes: a = Convert.ToBase64String((byte[])value.Value); break; case JTokenType.Guid: case JTokenType.TimeSpan: a = value.Value.ToString(); break; case JTokenType.Uri: a = ((Uri)value.Value).OriginalString; break; default: return false; } return string.Equals(a, b, StringComparison.Ordinal); } } }