using System.Linq; using JetBrains.Annotations; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using WireMock.Validation; namespace WireMock.Matchers { /// /// JsonPathMatcher /// /// /// public class JsonPathMatcher : IStringMatcher, IObjectMatcher { private readonly string[] _patterns; /// public MatchBehaviour MatchBehaviour { get; } /// /// Initializes a new instance of the class. /// /// The patterns. public JsonPathMatcher([NotNull] params string[] patterns) : this(MatchBehaviour.AcceptOnMatch, patterns) { } /// /// Initializes a new instance of the class. /// /// The match behaviour. /// The patterns. public JsonPathMatcher(MatchBehaviour matchBehaviour, [NotNull] params string[] patterns) { Check.NotNull(patterns, nameof(patterns)); MatchBehaviour = matchBehaviour; _patterns = patterns; } /// public double IsMatch(string input) { double match = MatchScores.Mismatch; if (input != null) { try { var jtoken = JToken.Parse(input); match = IsMatch(jtoken); } catch (JsonException) { // just ignore JsonException } } return MatchBehaviourHelper.Convert(MatchBehaviour, match); } /// public double IsMatch(object input) { double match = MatchScores.Mismatch; if (input != null) { try { // Check if JToken or object JToken jtoken = input is JToken token ? token : JObject.FromObject(input); match = IsMatch(jtoken); } catch (JsonException) { // just ignore JsonException } } return MatchBehaviourHelper.Convert(MatchBehaviour, match); } /// public string[] GetPatterns() { return _patterns; } /// public string Name => "JsonPathMatcher"; private double IsMatch(JToken jtoken) { // Wrap in array if needed JToken tokenOrArray = jtoken is JArray ? jtoken : new JArray(jtoken); return MatchScores.ToScore(_patterns.Select(pattern => tokenOrArray.SelectToken(pattern) != null)); } } }