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()
{