delete jsonutils.cs

This commit is contained in:
Stef Heyenrath
2026-04-30 22:51:47 +02:00
parent d0f9136570
commit 9277315ef9
7 changed files with 183 additions and 122 deletions
@@ -31,19 +31,19 @@ public partial class WireMockAssertions
} }
[CustomAssertion] [CustomAssertion]
public AndConstraint<WireMockAssertions> WithBodyAsJson(object body, string because = "", params object[] becauseArgs) public AndConstraint<WireMockAssertions> WithBodyAsJson(object body, IJsonMatcher? jsonMatcher = null, string because = "", params object[] becauseArgs)
{ {
return WithBodyAsJson(new JsonMatcher(body), because, becauseArgs); return WithBodyAsJson(jsonMatcher ?? new JsonMatcher(body), because, becauseArgs);
} }
[CustomAssertion] [CustomAssertion]
public AndConstraint<WireMockAssertions> WithBodyAsJson(string body, string because = "", params object[] becauseArgs) public AndConstraint<WireMockAssertions> WithBodyAsJson(string body, IJsonMatcher? jsonMatcher = null, string because = "", params object[] becauseArgs)
{ {
return WithBodyAsJson(new JsonMatcher(body), because, becauseArgs); return WithBodyAsJson(jsonMatcher ?? new JsonMatcher(body), because, becauseArgs);
} }
[CustomAssertion] [CustomAssertion]
public AndConstraint<WireMockAssertions> WithBodyAsJson(IObjectMatcher matcher, string because = "", params object[] becauseArgs) public AndConstraint<WireMockAssertions> WithBodyAsJson(IJsonMatcher matcher, string because = "", params object[] becauseArgs)
{ {
var (filter, condition) = BuildFilterAndCondition(r => r.BodyAsJson, matcher); var (filter, condition) = BuildFilterAndCondition(r => r.BodyAsJson, matcher);
@@ -126,15 +126,44 @@ public partial class WireMockAssertions
private static string? FormatBody(object? body) private static string? FormatBody(object? body)
{ {
return body switch if (body == null)
{ {
null => null, return null;
string str => str, }
AnyOf<string, StringPattern>[] stringPatterns => FormatBodies(stringPatterns.Select(p => p.GetPattern())),
byte[] bytes => $"byte[{bytes.Length}] {{...}}", if (body is string str)
JToken jToken => jToken.ToString(Formatting.None), {
_ => JToken.FromObject(body).ToString(Formatting.None) return str;
}; }
if (body is AnyOf<string, StringPattern>[] stringPatterns)
{
return FormatBodies(stringPatterns.Select(p => p.GetPattern()));
}
if (body is byte[] bytes)
{
return $"byte[{bytes.Length}] {{...}}";
}
if (body is JToken jToken)
{
return jToken.ToString(Formatting.None);
}
// System.IO.FileNotFoundException : Could not load file or assembly 'System.Text.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. The system cannot find the file specified.
var typeName = body.GetType().FullName;
if (typeName == "System.Text.Json.JsonElement")
{
return ((dynamic)body).GetRawText();
}
if (typeName == "System.Text.Json.JsonDocument")
{
return ((dynamic)body).RootElement.GetRawText();
}
return JToken.FromObject(body).ToString(Formatting.None);
} }
private static string? FormatBodies(IEnumerable<object?> bodies) private static string? FormatBodies(IEnumerable<object?> bodies)
@@ -31,19 +31,19 @@ public partial class WireMockAssertions
} }
[CustomAssertion] [CustomAssertion]
public AndConstraint<WireMockAssertions> WithBodyAsJson(object body, string because = "", params object[] becauseArgs) public AndConstraint<WireMockAssertions> WithBodyAsJson(object body, IJsonMatcher? jsonMatcher = null, string because = "", params object[] becauseArgs)
{ {
return WithBodyAsJson(new JsonMatcher(body), because, becauseArgs); return WithBodyAsJson(jsonMatcher ?? new JsonMatcher(body), because, becauseArgs);
} }
[CustomAssertion] [CustomAssertion]
public AndConstraint<WireMockAssertions> WithBodyAsJson(string body, string because = "", params object[] becauseArgs) public AndConstraint<WireMockAssertions> WithBodyAsJson(string body, IJsonMatcher? jsonMatcher = null, string because = "", params object[] becauseArgs)
{ {
return WithBodyAsJson(new JsonMatcher(body), because, becauseArgs); return WithBodyAsJson(jsonMatcher ?? new JsonMatcher(body), because, becauseArgs);
} }
[CustomAssertion] [CustomAssertion]
public AndConstraint<WireMockAssertions> WithBodyAsJson(IObjectMatcher matcher, string because = "", params object[] becauseArgs) public AndConstraint<WireMockAssertions> WithBodyAsJson(IJsonMatcher matcher, string because = "", params object[] becauseArgs)
{ {
var (filter, condition) = BuildFilterAndCondition(r => r.BodyAsJson, matcher); var (filter, condition) = BuildFilterAndCondition(r => r.BodyAsJson, matcher);
@@ -126,15 +126,44 @@ public partial class WireMockAssertions
private static string? FormatBody(object? body) private static string? FormatBody(object? body)
{ {
return body switch if (body == null)
{ {
null => null, return null;
string str => str, }
AnyOf<string, StringPattern>[] stringPatterns => FormatBodies(stringPatterns.Select(p => p.GetPattern())),
byte[] bytes => $"byte[{bytes.Length}] {{...}}", if (body is string str)
JToken jToken => jToken.ToString(Formatting.None), {
_ => JToken.FromObject(body).ToString(Formatting.None) return str;
}; }
if (body is AnyOf<string, StringPattern>[] stringPatterns)
{
return FormatBodies(stringPatterns.Select(p => p.GetPattern()));
}
if (body is byte[] bytes)
{
return $"byte[{bytes.Length}] {{...}}";
}
if (body is JToken jToken)
{
return jToken.ToString(Formatting.None);
}
// System.IO.FileNotFoundException : Could not load file or assembly 'System.Text.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. The system cannot find the file specified.
var typeName = body.GetType().FullName;
if (typeName == "System.Text.Json.JsonElement")
{
return ((dynamic)body).GetRawText();
}
if (typeName == "System.Text.Json.JsonDocument")
{
return ((dynamic)body).RootElement.GetRawText();
}
return JToken.FromObject(body).ToString(Formatting.None);
} }
private static string? FormatBodies(IEnumerable<object?> bodies) private static string? FormatBodies(IEnumerable<object?> bodies)
@@ -1,6 +1,8 @@
// Copyright © WireMock.Net // Copyright © WireMock.Net
using System.Linq; using System.Linq;
using System.Text;
using Newtonsoft.Json;
using WireMock.Admin.Mappings; using WireMock.Admin.Mappings;
using WireMock.Extensions; using WireMock.Extensions;
using WireMock.Pact.Models.V2; using WireMock.Pact.Models.V2;
@@ -49,7 +51,7 @@ internal static class PactMapper
pact.Interactions.Add(interaction); pact.Interactions.Add(interaction);
} }
return (filename, JsonUtils.SerializeAsPactFile(pact)); return (filename, SerializeAsPactFile(pact));
} }
private static PactRequest MapRequest(RequestModel request, string path) private static PactRequest MapRequest(RequestModel request, string path)
@@ -152,7 +154,7 @@ internal static class PactMapper
/// </summary> /// </summary>
private static object? TryDeserializeJsonStringAsObject(string? value) private static object? TryDeserializeJsonStringAsObject(string? value)
{ {
return value != null ? JsonUtils.TryDeserializeObject<object?>(value) ?? value : null; return value != null ? TryDeserializeObject<object?>(value) ?? value : null;
} }
//private static string GetPatternAsStringFromMatchers(MatcherModel[]? matchers, string defaultValue) //private static string GetPatternAsStringFromMatchers(MatcherModel[]? matchers, string defaultValue)
@@ -164,4 +166,22 @@ internal static class PactMapper
// return defaultValue; // return defaultValue;
//} //}
private static byte[] SerializeAsPactFile(object value)
{
var json = JsonConvert.SerializeObject(value, JsonSerializationConstants.JsonSerializerSettingsPact);
return Encoding.UTF8.GetBytes(json);
}
private static T? TryDeserializeObject<T>(string json)
{
try
{
return JsonConvert.DeserializeObject<T>(json);
}
catch
{
return default;
}
}
} }
@@ -1,7 +1,8 @@
// Copyright © WireMock.Net // Copyright © WireMock.Net
using System.Linq; using System.Diagnostics.CodeAnalysis;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NJsonSchema; using NJsonSchema;
using NJsonSchema.Extensions; using NJsonSchema.Extensions;
using NSwag; using NSwag;
@@ -281,7 +282,7 @@ internal static class SwaggerMapper
if (matcher is { Name: nameof(JsonMatcher) }) if (matcher is { Name: nameof(JsonMatcher) })
{ {
var pattern = GetPatternAsStringFromMatcher(matcher); var pattern = GetPatternAsStringFromMatcher(matcher);
if (JsonUtils.TryParseAsJObject(pattern, out var jObject)) if (TryParseAsJObject(pattern, out var jObject))
{ {
return jObject; return jObject;
} }
@@ -292,6 +293,39 @@ internal static class SwaggerMapper
return null; return null;
} }
private static bool IsJson(string? value)
{
if (string.IsNullOrWhiteSpace(value))
{
return false;
}
value = value!.Trim();
return (value.StartsWith("{") && value.EndsWith("}")) || (value.StartsWith("[") && value.EndsWith("]"));
}
private static bool TryParseAsJObject(string? strInput, [NotNullWhen(true)] out JObject? value)
{
value = null;
if (!IsJson(strInput))
{
return false;
}
try
{
// Try to convert this string into a JObject
value = JObject.Parse(strInput!);
return true;
}
catch
{
return false;
}
}
private static string GetContentType(RequestModel request) private static string GetContentType(RequestModel request)
{ {
var contentType = request.Headers?.FirstOrDefault(h => h.Name == "Content-Type"); var contentType = request.Headers?.FirstOrDefault(h => h.Name == "Content-Type");
@@ -32,15 +32,15 @@ public partial class WireMockAdminApiAssertions
} }
[CustomAssertion] [CustomAssertion]
public AndConstraint<WireMockAdminApiAssertions> WithBodyAsJson(object body, string because = "", params object[] becauseArgs) public AndConstraint<WireMockAdminApiAssertions> WithBodyAsJson(object body, IJsonMatcher? jsonMatcher = null, string because = "", params object[] becauseArgs)
{ {
return WithBodyAsJson(new JsonMatcher(body), because, becauseArgs); return WithBodyAsJson(jsonMatcher ?? new JsonMatcher(body), because, becauseArgs);
} }
[CustomAssertion] [CustomAssertion]
public AndConstraint<WireMockAdminApiAssertions> WithBodyAsJson(string body, string because = "", params object[] becauseArgs) public AndConstraint<WireMockAdminApiAssertions> WithBodyAsJson(string body, IJsonMatcher? jsonMatcher = null, string because = "", params object[] becauseArgs)
{ {
return WithBodyAsJson(new JsonMatcher(body), because, becauseArgs); return WithBodyAsJson(jsonMatcher ?? new JsonMatcher(body), because, becauseArgs);
} }
[CustomAssertion] [CustomAssertion]
@@ -127,15 +127,44 @@ public partial class WireMockAdminApiAssertions
private static string? FormatBody(object? body) private static string? FormatBody(object? body)
{ {
return body switch if (body == null)
{ {
null => null, return null;
string str => str, }
AnyOf<string, StringPattern>[] stringPatterns => FormatBodies(stringPatterns.Select(p => p.GetPattern())),
byte[] bytes => $"byte[{bytes.Length}] {{...}}", if (body is string str)
JToken jToken => jToken.ToString(Formatting.None), {
_ => JToken.FromObject(body).ToString(Formatting.None) return str;
}; }
if (body is AnyOf<string, StringPattern>[] stringPatterns)
{
return FormatBodies(stringPatterns.Select(p => p.GetPattern()));
}
if (body is byte[] bytes)
{
return $"byte[{bytes.Length}] {{...}}";
}
if (body is JToken jToken)
{
return jToken.ToString(Formatting.None);
}
// System.IO.FileNotFoundException : Could not load file or assembly 'System.Text.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. The system cannot find the file specified.
var typeName = body.GetType().FullName;
if (typeName == "System.Text.Json.JsonElement")
{
return ((dynamic)body).GetRawText();
}
if (typeName == "System.Text.Json.JsonDocument")
{
return ((dynamic)body).RootElement.GetRawText();
}
return JToken.FromObject(body).ToString(Formatting.None);
} }
private static string? FormatBodies(IEnumerable<object?> bodies) private static string? FormatBodies(IEnumerable<object?> bodies)
@@ -26,12 +26,6 @@ internal static class JsonSerializationConstants
DateParseHandling = 0 DateParseHandling = 0
}; };
internal static readonly JsonSerializerSettings JsonSerializerSettingsIncludeNullValues = new()
{
Formatting = Formatting.Indented,
NullValueHandling = NullValueHandling.Include
};
internal static readonly JsonSerializerSettings JsonDeserializerSettingsWithDateParsingNone = new() internal static readonly JsonSerializerSettings JsonDeserializerSettingsWithDateParsingNone = new()
{ {
DateParseHandling = DateParseHandling.None DateParseHandling = DateParseHandling.None
-74
View File
@@ -1,74 +0,0 @@
// Copyright © WireMock.Net
using System.Diagnostics.CodeAnalysis;
using System.Text;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using WireMock.Serialization;
namespace WireMock.Util;
internal static class JsonUtils
{
public static bool IsJson(string? value)
{
if (string.IsNullOrWhiteSpace(value))
{
return false;
}
value = value!.Trim();
return (value.StartsWith("{") && value.EndsWith("}")) || (value.StartsWith("[") && value.EndsWith("]"));
}
public static bool TryParseAsJObject(string? strInput, [NotNullWhen(true)] out JObject? value)
{
value = null;
if (!IsJson(strInput))
{
return false;
}
try
{
// Try to convert this string into a JObject
value = JObject.Parse(strInput!);
return true;
}
catch
{
return false;
}
}
public static byte[] SerializeAsPactFile(object value)
{
var json = JsonConvert.SerializeObject(value, JsonSerializationConstants.JsonSerializerSettingsPact);
return Encoding.UTF8.GetBytes(json);
}
/// <summary>
/// Deserializes the JSON to a .NET object.
/// Using : DateParseHandling = DateParseHandling.None
/// </summary>
/// <param name="json">A System.String that contains JSON.</param>
/// <returns>The deserialized object from the JSON string.</returns>
public static object DeserializeObject(string json)
{
return JsonConvert.DeserializeObject(json, JsonSerializationConstants.JsonDeserializerSettingsWithDateParsingNone)!;
}
public static T? TryDeserializeObject<T>(string json)
{
try
{
return JsonConvert.DeserializeObject<T>(json);
}
catch
{
return default;
}
}
}