diff --git a/src/WireMock.Net/Matchers/JsonMatcher.cs b/src/WireMock.Net/Matchers/JsonMatcher.cs index 566e232e..d7d0f758 100644 --- a/src/WireMock.Net/Matchers/JsonMatcher.cs +++ b/src/WireMock.Net/Matchers/JsonMatcher.cs @@ -1,6 +1,7 @@ using JetBrains.Annotations; using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using System.Collections; using System.Linq; using WireMock.Util; using WireMock.Validation; @@ -85,7 +86,7 @@ namespace WireMock.Matchers // Check if JToken or object JToken jtokenInput = input is JToken tokenInput ? tokenInput : JObject.FromObject(input); - // Check if JToken or string or object + // Check if JToken, string, IEnumerable or object JToken jtokenValue; switch (Value) { @@ -97,6 +98,10 @@ namespace WireMock.Matchers jtokenValue = JsonUtils.Parse(stringValue); break; + case IEnumerable enumerableValue: + jtokenValue = JArray.FromObject(enumerableValue); + break; + default: jtokenValue = JObject.FromObject(Value); break; diff --git a/src/WireMock.Net/Transformers/HandleBarsJsonPath.cs b/src/WireMock.Net/Transformers/HandleBarsJsonPath.cs index 7737b062..dc6e9871 100644 --- a/src/WireMock.Net/Transformers/HandleBarsJsonPath.cs +++ b/src/WireMock.Net/Transformers/HandleBarsJsonPath.cs @@ -2,6 +2,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; +using System.Collections; using System.Linq; using WireMock.Util; using WireMock.Validation; @@ -14,7 +15,7 @@ namespace WireMock.Transformers { handlebarsContext.RegisterHelper("JsonPath.SelectToken", (writer, context, arguments) => { - (JObject valueToProcess, string jsonPath) = ParseArguments(arguments); + (JToken valueToProcess, string jsonPath) = ParseArguments(arguments); try { @@ -29,7 +30,7 @@ namespace WireMock.Transformers handlebarsContext.RegisterHelper("JsonPath.SelectTokens", (writer, options, context, arguments) => { - (JObject valueToProcess, string jsonPath) = ParseArguments(arguments); + (JToken valueToProcess, string jsonPath) = ParseArguments(arguments); try { @@ -46,22 +47,26 @@ namespace WireMock.Transformers }); } - private static (JObject valueToProcess, string jsonpath) ParseArguments(object[] arguments) + private static (JToken valueToProcess, string jsonpath) ParseArguments(object[] arguments) { Check.Condition(arguments, args => args.Length == 2, nameof(arguments)); Check.NotNull(arguments[0], "arguments[0]"); Check.NotNullOrEmpty(arguments[1] as string, "arguments[1]"); - JObject valueToProcess; + JToken valueToProcess; switch (arguments[0]) { - case string jsonAsString: - valueToProcess = JsonUtils.Parse(jsonAsString); + case JToken tokenValue: + valueToProcess = tokenValue; break; - case JObject jsonAsJObject: - valueToProcess = jsonAsJObject; + case string stringValue: + valueToProcess = JsonUtils.Parse(stringValue); + break; + + case IEnumerable enumerableValue: + valueToProcess = JArray.FromObject(enumerableValue); break; default: diff --git a/src/WireMock.Net/Util/JsonUtils.cs b/src/WireMock.Net/Util/JsonUtils.cs index a1ed8469..3340f1da 100644 --- a/src/WireMock.Net/Util/JsonUtils.cs +++ b/src/WireMock.Net/Util/JsonUtils.cs @@ -19,10 +19,10 @@ namespace WireMock.Util /// Using : DateParseHandling = DateParseHandling.None /// /// A System.String that contains JSON. - /// A Newtonsoft.Json.Linq.JObject populated from the string that contains JSON. - public static JObject Parse(string json) + /// A Newtonsoft.Json.Linq.JToken populated from the string that contains JSON. + public static JToken Parse(string json) { - return JsonConvert.DeserializeObject(json, JsonSerializerSettings); + return JsonConvert.DeserializeObject(json, JsonSerializerSettings); } public static T ParseJTokenToObject(object value) diff --git a/test/WireMock.Net.Tests/Matchers/JsonMatcherTests.cs b/test/WireMock.Net.Tests/Matchers/JsonMatcherTests.cs index f25d4d6d..82f4163a 100644 --- a/test/WireMock.Net.Tests/Matchers/JsonMatcherTests.cs +++ b/test/WireMock.Net.Tests/Matchers/JsonMatcherTests.cs @@ -75,6 +75,24 @@ namespace WireMock.Net.Tests.Matchers Check.That(match).IsEqualTo(0); } + [Fact] + public void JsonMatcher_IsMatch_JArray() + { + // Assign + var matcher = new JsonMatcher(new[] { "x", "y" }); + + // Act + var jArray = new JArray + { + "x", + "y" + }; + double match = matcher.IsMatch(jArray); + + // Assert + Assert.Equal(1.0, match); + } + [Fact] public void JsonMatcher_IsMatch_JObject() { @@ -139,6 +157,24 @@ namespace WireMock.Net.Tests.Matchers Assert.Equal(1.0, match); } + [Fact] + public void JsonMatcher_IsMatch_JArrayAsString() + { + // Assign + var matcher = new JsonMatcher("[ \"x\", \"y\" ]"); + + // Act + var jArray = new JArray + { + "x", + "y" + }; + double match = matcher.IsMatch(jArray); + + // Assert + Assert.Equal(1.0, match); + } + [Fact] public void JsonMatcher_IsMatch_JObjectAsString() {