diff --git a/test/Microsoft.OpenApi.Hidi.Tests/Microsoft.OpenApi.Hidi.Tests.csproj b/test/Microsoft.OpenApi.Hidi.Tests/Microsoft.OpenApi.Hidi.Tests.csproj index 397831833..07a571a57 100644 --- a/test/Microsoft.OpenApi.Hidi.Tests/Microsoft.OpenApi.Hidi.Tests.csproj +++ b/test/Microsoft.OpenApi.Hidi.Tests/Microsoft.OpenApi.Hidi.Tests.csproj @@ -14,7 +14,6 @@ - diff --git a/test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj b/test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj index daf6dbd1c..e528cdcd5 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj +++ b/test/Microsoft.OpenApi.Readers.Tests/Microsoft.OpenApi.Readers.Tests.csproj @@ -19,7 +19,6 @@ - diff --git a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj index 0d532f1ec..d71445022 100644 --- a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj +++ b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj @@ -13,7 +13,6 @@ - diff --git a/test/Microsoft.OpenApi.Tests/Writers/OpenApiJsonWriterTests.cs b/test/Microsoft.OpenApi.Tests/Writers/OpenApiJsonWriterTests.cs index a967c43a0..30247333f 100644 --- a/test/Microsoft.OpenApi.Tests/Writers/OpenApiJsonWriterTests.cs +++ b/test/Microsoft.OpenApi.Tests/Writers/OpenApiJsonWriterTests.cs @@ -8,12 +8,14 @@ using System.IO; using System.Linq; using System.Text; +using System.Text.Encodings.Web; +using System.Text.Json; using System.Text.Json.Nodes; +using System.Text.Json.Serialization; using FluentAssertions; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Writers; -using Newtonsoft.Json; using Xunit; namespace Microsoft.OpenApi.Tests.Writers @@ -62,9 +64,9 @@ public void WriteStringListAsJsonShouldMatchExpected(string[] stringValues, bool writer.WriteEndArray(); writer.Flush(); - var parsedObject = JsonConvert.DeserializeObject(outputString.GetStringBuilder().ToString()); + var parsedObject = JsonSerializer.Deserialize>(outputString.GetStringBuilder().ToString()); var expectedObject = - JsonConvert.DeserializeObject(JsonConvert.SerializeObject(new List(stringValues))); + JsonSerializer.Deserialize>(JsonSerializer.Serialize(new List(stringValues))); // Assert parsedObject.Should().BeEquivalentTo(expectedObject); @@ -222,17 +224,17 @@ private void WriteValueRecursive(OpenApiJsonWriter writer, object value) public void WriteMapAsJsonShouldMatchExpected(IDictionary inputMap, bool produceTerseOutput) { // Arrange - var outputString = new StringWriter(CultureInfo.InvariantCulture); + using var outputString = new StringWriter(CultureInfo.InvariantCulture); var writer = new OpenApiJsonWriter(outputString, new() { Terse = produceTerseOutput }); // Act WriteValueRecursive(writer, inputMap); - var parsedObject = JsonConvert.DeserializeObject(outputString.GetStringBuilder().ToString()); - var expectedObject = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(inputMap)); + using var parsedObject = JsonDocument.Parse(outputString.GetStringBuilder().ToString()); + using var expectedObject = JsonDocument.Parse(JsonSerializer.Serialize(inputMap, _jsonSerializerOptions.Value)); // Assert - parsedObject.Should().BeEquivalentTo(expectedObject); + Assert.True(JsonElement.DeepEquals(parsedObject.RootElement, expectedObject.RootElement)); } public static IEnumerable WriteDateTimeAsJsonTestCases() @@ -248,6 +250,57 @@ from shouldBeTerse in shouldProduceTerseOutputValues select new object[] { input, shouldBeTerse }; } + public class CustomDateTimeOffsetConverter : JsonConverter + { + public CustomDateTimeOffsetConverter(string format) + { + ArgumentException.ThrowIfNullOrEmpty(format); + Format = format; + } + + public string Format { get; } + + public override DateTimeOffset Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return DateTime.ParseExact(reader.GetString(), Format, CultureInfo.InvariantCulture); + } + + public override void Write(Utf8JsonWriter writer, DateTimeOffset value, JsonSerializerOptions options) + { + writer.WriteStringValue(value.ToString(Format)); + } + } + public class CustomDateTimeConverter : JsonConverter + { + public CustomDateTimeConverter(string format) + { + ArgumentException.ThrowIfNullOrEmpty(format); + Format = format; + } + + public string Format { get; } + + public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return DateTime.ParseExact(reader.GetString(), Format, CultureInfo.InvariantCulture); + } + + public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options) + { + writer.WriteStringValue(value.ToString(Format)); + } + } + private static readonly Lazy _jsonSerializerOptions = new(() => + { + var options = new JsonSerializerOptions + { + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping + }; + options.Converters.Add(new CustomDateTimeOffsetConverter("yyyy-MM-ddTHH:mm:ss.fffffffK")); + options.Converters.Add(new CustomDateTimeConverter("yyyy-MM-ddTHH:mm:ss.fffffffK")); + return options; + }); + [Theory] [MemberData(nameof(WriteDateTimeAsJsonTestCases))] public void WriteDateTimeAsJsonShouldMatchExpected(DateTimeOffset dateTimeOffset, bool produceTerseOutput) @@ -260,10 +313,7 @@ public void WriteDateTimeAsJsonShouldMatchExpected(DateTimeOffset dateTimeOffset writer.WriteValue(dateTimeOffset); var writtenString = outputString.GetStringBuilder().ToString(); - var expectedString = JsonConvert.SerializeObject(dateTimeOffset, new JsonSerializerSettings - { - DateFormatString = "yyyy-MM-ddTHH:mm:ss.fffffffK", - }); + var expectedString = JsonSerializer.Serialize(dateTimeOffset, _jsonSerializerOptions.Value); // Assert writtenString.Should().Be(expectedString);