From aabe6550de50ce8d74ee6432bec7ec4985e9cea0 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Tue, 8 Oct 2019 18:54:09 +0200 Subject: [PATCH 1/4] . --- .../Matchers/JsonMatcherTests.cs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/test/WireMock.Net.Tests/Matchers/JsonMatcherTests.cs b/test/WireMock.Net.Tests/Matchers/JsonMatcherTests.cs index 87ff302a5..7f2a3d9c7 100644 --- a/test/WireMock.Net.Tests/Matchers/JsonMatcherTests.cs +++ b/test/WireMock.Net.Tests/Matchers/JsonMatcherTests.cs @@ -192,5 +192,22 @@ public void JsonMatcher_IsMatch_JObjectAsString_RejectOnMatch() // Assert Assert.Equal(0.0, match); } + + [Fact] + public void JsonMatcher_IsMatch_JObjectWithDateTimeOffsetAsString() + { + // Assign + var matcher = new JsonMatcher("{ \"preferredAt\" : \"2019-11-21T10:32:53.2210009+00:00\" }"); + + // Act + var jobject = new JObject + { + { "Name", new JValue("2019-11-21T10:32:53.2210009+00:00") } + }; + double match = matcher.IsMatch(jobject); + + // Assert + Assert.Equal(1.0, match); + } } } \ No newline at end of file From ab5d35ef8d412a45b79b7bae68625dfee71b007c Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Tue, 8 Oct 2019 20:59:35 +0200 Subject: [PATCH 2/4] JObject Parse --- src/WireMock.Net/Matchers/JsonMatcher.cs | 12 +++++++++--- src/WireMock.Net/Util/JsonUtils.cs | 14 +++++++++++++- .../Matchers/JsonMatcherTests.cs | 2 +- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/WireMock.Net/Matchers/JsonMatcher.cs b/src/WireMock.Net/Matchers/JsonMatcher.cs index 467bd062a..17043359c 100644 --- a/src/WireMock.Net/Matchers/JsonMatcher.cs +++ b/src/WireMock.Net/Matchers/JsonMatcher.cs @@ -1,7 +1,8 @@ -using System.Linq; -using JetBrains.Annotations; +using JetBrains.Annotations; using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using System.Linq; +using WireMock.Util; using WireMock.Validation; namespace WireMock.Matchers @@ -11,6 +12,11 @@ namespace WireMock.Matchers /// public class JsonMatcher : IValueMatcher, IIgnoreCaseMatcher { + private readonly JsonSerializerSettings _settings = new JsonSerializerSettings() + { + DateParseHandling = DateParseHandling.None + }; + /// public object Value { get; } @@ -93,7 +99,7 @@ public double IsMatch(object input) break; case string stringValue: - jtokenValue = JToken.Parse(stringValue); + jtokenValue = JsonUtils.Parse(stringValue, _settings); break; default: diff --git a/src/WireMock.Net/Util/JsonUtils.cs b/src/WireMock.Net/Util/JsonUtils.cs index 79ccba9e7..ecfdcc09a 100644 --- a/src/WireMock.Net/Util/JsonUtils.cs +++ b/src/WireMock.Net/Util/JsonUtils.cs @@ -1,4 +1,5 @@ -using Newtonsoft.Json.Linq; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; @@ -8,6 +9,17 @@ namespace WireMock.Util { internal static class JsonUtils { + /// + /// Load a Newtonsoft.Json.Linq.JObject from a string that contains JSON. + /// + /// A System.String that contains JSON. + /// The JsonSerializerSettings. + /// A Newtonsoft.Json.Linq.JObject populated from the string that contains JSON. + public static JObject Parse(string json, JsonSerializerSettings settings) + { + return JsonConvert.DeserializeObject(json, settings); + } + public static T ParseJTokenToObject(object value) { switch (value) diff --git a/test/WireMock.Net.Tests/Matchers/JsonMatcherTests.cs b/test/WireMock.Net.Tests/Matchers/JsonMatcherTests.cs index 7f2a3d9c7..f25d4d6d2 100644 --- a/test/WireMock.Net.Tests/Matchers/JsonMatcherTests.cs +++ b/test/WireMock.Net.Tests/Matchers/JsonMatcherTests.cs @@ -202,7 +202,7 @@ public void JsonMatcher_IsMatch_JObjectWithDateTimeOffsetAsString() // Act var jobject = new JObject { - { "Name", new JValue("2019-11-21T10:32:53.2210009+00:00") } + { "preferredAt", new JValue("2019-11-21T10:32:53.2210009+00:00") } }; double match = matcher.IsMatch(jobject); From 16a5c820179b11766159ce654811ac5353de758e Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Wed, 9 Oct 2019 10:09:28 +0200 Subject: [PATCH 3/4] JsonUtils.Parse --- src/WireMock.Net/Matchers/JsonMatcher.cs | 4 ++-- .../Transformers/HandleBarsJsonPath.cs | 16 +++++++++++----- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/WireMock.Net/Matchers/JsonMatcher.cs b/src/WireMock.Net/Matchers/JsonMatcher.cs index 17043359c..995aea7a6 100644 --- a/src/WireMock.Net/Matchers/JsonMatcher.cs +++ b/src/WireMock.Net/Matchers/JsonMatcher.cs @@ -12,7 +12,7 @@ namespace WireMock.Matchers /// public class JsonMatcher : IValueMatcher, IIgnoreCaseMatcher { - private readonly JsonSerializerSettings _settings = new JsonSerializerSettings() + private readonly JsonSerializerSettings _jsonSerializerSettings = new JsonSerializerSettings() { DateParseHandling = DateParseHandling.None }; @@ -99,7 +99,7 @@ public double IsMatch(object input) break; case string stringValue: - jtokenValue = JsonUtils.Parse(stringValue, _settings); + jtokenValue = JsonUtils.Parse(stringValue, _jsonSerializerSettings); break; default: diff --git a/src/WireMock.Net/Transformers/HandleBarsJsonPath.cs b/src/WireMock.Net/Transformers/HandleBarsJsonPath.cs index d7eacadca..9353c4ee5 100644 --- a/src/WireMock.Net/Transformers/HandleBarsJsonPath.cs +++ b/src/WireMock.Net/Transformers/HandleBarsJsonPath.cs @@ -1,14 +1,20 @@ -using System; -using System.Linq; -using HandlebarsDotNet; +using HandlebarsDotNet; using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using System; +using System.Linq; +using WireMock.Util; using WireMock.Validation; namespace WireMock.Transformers { internal static class HandleBarsJsonPath { + private static readonly JsonSerializerSettings JsonSerializerSettings = new JsonSerializerSettings() + { + DateParseHandling = DateParseHandling.None + }; + public static void Register(IHandlebars handlebarsContext) { handlebarsContext.RegisterHelper("JsonPath.SelectToken", (writer, context, arguments) => @@ -56,7 +62,7 @@ private static (JObject valueToProcess, string jsonpath) ParseArguments(object[] switch (arguments[0]) { case string jsonAsString: - valueToProcess = JObject.Parse(jsonAsString); + valueToProcess = JsonUtils.Parse(jsonAsString, JsonSerializerSettings); break; case JObject jsonAsJObject: @@ -67,7 +73,7 @@ private static (JObject valueToProcess, string jsonpath) ParseArguments(object[] throw new NotSupportedException($"The value '{arguments[0]}' with type '{arguments[0]?.GetType()}' cannot be used in Handlebars JsonPath."); } - return (valueToProcess, (string) arguments[1]); + return (valueToProcess, (string)arguments[1]); } } } \ No newline at end of file From 0d3831aa5df13b1d2c0536e794358002ae28af46 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Wed, 9 Oct 2019 10:58:42 +0200 Subject: [PATCH 4/4] fix code comments --- src/WireMock.Net/Matchers/JsonMatcher.cs | 7 +------ src/WireMock.Net/Transformers/HandleBarsJsonPath.cs | 7 +------ src/WireMock.Net/Util/JsonUtils.cs | 11 ++++++++--- 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/WireMock.Net/Matchers/JsonMatcher.cs b/src/WireMock.Net/Matchers/JsonMatcher.cs index 995aea7a6..566e232ed 100644 --- a/src/WireMock.Net/Matchers/JsonMatcher.cs +++ b/src/WireMock.Net/Matchers/JsonMatcher.cs @@ -12,11 +12,6 @@ namespace WireMock.Matchers /// public class JsonMatcher : IValueMatcher, IIgnoreCaseMatcher { - private readonly JsonSerializerSettings _jsonSerializerSettings = new JsonSerializerSettings() - { - DateParseHandling = DateParseHandling.None - }; - /// public object Value { get; } @@ -99,7 +94,7 @@ public double IsMatch(object input) break; case string stringValue: - jtokenValue = JsonUtils.Parse(stringValue, _jsonSerializerSettings); + jtokenValue = JsonUtils.Parse(stringValue); break; default: diff --git a/src/WireMock.Net/Transformers/HandleBarsJsonPath.cs b/src/WireMock.Net/Transformers/HandleBarsJsonPath.cs index 9353c4ee5..7737b062c 100644 --- a/src/WireMock.Net/Transformers/HandleBarsJsonPath.cs +++ b/src/WireMock.Net/Transformers/HandleBarsJsonPath.cs @@ -10,11 +10,6 @@ namespace WireMock.Transformers { internal static class HandleBarsJsonPath { - private static readonly JsonSerializerSettings JsonSerializerSettings = new JsonSerializerSettings() - { - DateParseHandling = DateParseHandling.None - }; - public static void Register(IHandlebars handlebarsContext) { handlebarsContext.RegisterHelper("JsonPath.SelectToken", (writer, context, arguments) => @@ -62,7 +57,7 @@ private static (JObject valueToProcess, string jsonpath) ParseArguments(object[] switch (arguments[0]) { case string jsonAsString: - valueToProcess = JsonUtils.Parse(jsonAsString, JsonSerializerSettings); + valueToProcess = JsonUtils.Parse(jsonAsString); break; case JObject jsonAsJObject: diff --git a/src/WireMock.Net/Util/JsonUtils.cs b/src/WireMock.Net/Util/JsonUtils.cs index ecfdcc09a..a1ed84692 100644 --- a/src/WireMock.Net/Util/JsonUtils.cs +++ b/src/WireMock.Net/Util/JsonUtils.cs @@ -9,15 +9,20 @@ namespace WireMock.Util { internal static class JsonUtils { + private static readonly JsonSerializerSettings JsonSerializerSettings = new JsonSerializerSettings + { + DateParseHandling = DateParseHandling.None + }; + /// /// Load a Newtonsoft.Json.Linq.JObject from a string that contains JSON. + /// Using : DateParseHandling = DateParseHandling.None /// /// A System.String that contains JSON. - /// The JsonSerializerSettings. /// A Newtonsoft.Json.Linq.JObject populated from the string that contains JSON. - public static JObject Parse(string json, JsonSerializerSettings settings) + public static JObject Parse(string json) { - return JsonConvert.DeserializeObject(json, settings); + return JsonConvert.DeserializeObject(json, JsonSerializerSettings); } public static T ParseJTokenToObject(object value)