88using System . IO ;
99using System . Linq ;
1010using System . Text ;
11+ using System . Text . Encodings . Web ;
12+ using System . Text . Json ;
1113using System . Text . Json . Nodes ;
14+ using System . Text . Json . Serialization ;
1215using FluentAssertions ;
1316using Microsoft . OpenApi . Any ;
1417using Microsoft . OpenApi . Models ;
1518using Microsoft . OpenApi . Writers ;
16- using Newtonsoft . Json ;
1719using Xunit ;
1820
1921namespace Microsoft . OpenApi . Tests . Writers
@@ -62,9 +64,9 @@ public void WriteStringListAsJsonShouldMatchExpected(string[] stringValues, bool
6264 writer . WriteEndArray ( ) ;
6365 writer . Flush ( ) ;
6466
65- var parsedObject = JsonConvert . DeserializeObject ( outputString . GetStringBuilder ( ) . ToString ( ) ) ;
67+ var parsedObject = JsonSerializer . Deserialize < List < string > > ( outputString . GetStringBuilder ( ) . ToString ( ) ) ;
6668 var expectedObject =
67- JsonConvert . DeserializeObject ( JsonConvert . SerializeObject ( new List < string > ( stringValues ) ) ) ;
69+ JsonSerializer . Deserialize < List < string > > ( JsonSerializer . Serialize ( new List < string > ( stringValues ) ) ) ;
6870
6971 // Assert
7072 parsedObject . Should ( ) . BeEquivalentTo ( expectedObject ) ;
@@ -222,17 +224,17 @@ private void WriteValueRecursive(OpenApiJsonWriter writer, object value)
222224 public void WriteMapAsJsonShouldMatchExpected ( IDictionary < string , object > inputMap , bool produceTerseOutput )
223225 {
224226 // Arrange
225- var outputString = new StringWriter ( CultureInfo . InvariantCulture ) ;
227+ using var outputString = new StringWriter ( CultureInfo . InvariantCulture ) ;
226228 var writer = new OpenApiJsonWriter ( outputString , new ( ) { Terse = produceTerseOutput } ) ;
227229
228230 // Act
229231 WriteValueRecursive ( writer , inputMap ) ;
230232
231- var parsedObject = JsonConvert . DeserializeObject ( outputString . GetStringBuilder ( ) . ToString ( ) ) ;
232- var expectedObject = JsonConvert . DeserializeObject ( JsonConvert . SerializeObject ( inputMap ) ) ;
233+ using var parsedObject = JsonDocument . Parse ( outputString . GetStringBuilder ( ) . ToString ( ) ) ;
234+ using var expectedObject = JsonDocument . Parse ( JsonSerializer . Serialize ( inputMap , _jsonSerializerOptions . Value ) ) ;
233235
234236 // Assert
235- parsedObject . Should ( ) . BeEquivalentTo ( expectedObject ) ;
237+ Assert . True ( JsonElement . DeepEquals ( parsedObject . RootElement , expectedObject . RootElement ) ) ;
236238 }
237239
238240 public static IEnumerable < object [ ] > WriteDateTimeAsJsonTestCases ( )
@@ -248,6 +250,57 @@ from shouldBeTerse in shouldProduceTerseOutputValues
248250 select new object [ ] { input , shouldBeTerse } ;
249251 }
250252
253+ public class CustomDateTimeOffsetConverter : JsonConverter < DateTimeOffset >
254+ {
255+ public CustomDateTimeOffsetConverter ( string format )
256+ {
257+ ArgumentException . ThrowIfNullOrEmpty ( format ) ;
258+ Format = format ;
259+ }
260+
261+ public string Format { get ; }
262+
263+ public override DateTimeOffset Read ( ref Utf8JsonReader reader , Type typeToConvert , JsonSerializerOptions options )
264+ {
265+ return DateTime . ParseExact ( reader . GetString ( ) , Format , CultureInfo . InvariantCulture ) ;
266+ }
267+
268+ public override void Write ( Utf8JsonWriter writer , DateTimeOffset value , JsonSerializerOptions options )
269+ {
270+ writer . WriteStringValue ( value . ToString ( Format ) ) ;
271+ }
272+ }
273+ public class CustomDateTimeConverter : JsonConverter < DateTime >
274+ {
275+ public CustomDateTimeConverter ( string format )
276+ {
277+ ArgumentException . ThrowIfNullOrEmpty ( format ) ;
278+ Format = format ;
279+ }
280+
281+ public string Format { get ; }
282+
283+ public override DateTime Read ( ref Utf8JsonReader reader , Type typeToConvert , JsonSerializerOptions options )
284+ {
285+ return DateTime . ParseExact ( reader . GetString ( ) , Format , CultureInfo . InvariantCulture ) ;
286+ }
287+
288+ public override void Write ( Utf8JsonWriter writer , DateTime value , JsonSerializerOptions options )
289+ {
290+ writer . WriteStringValue ( value . ToString ( Format ) ) ;
291+ }
292+ }
293+ private static readonly Lazy < JsonSerializerOptions > _jsonSerializerOptions = new ( ( ) =>
294+ {
295+ var options = new JsonSerializerOptions
296+ {
297+ Encoder = JavaScriptEncoder . UnsafeRelaxedJsonEscaping
298+ } ;
299+ options . Converters . Add ( new CustomDateTimeOffsetConverter ( "yyyy-MM-ddTHH:mm:ss.fffffffK" ) ) ;
300+ options . Converters . Add ( new CustomDateTimeConverter ( "yyyy-MM-ddTHH:mm:ss.fffffffK" ) ) ;
301+ return options ;
302+ } ) ;
303+
251304 [ Theory ]
252305 [ MemberData ( nameof ( WriteDateTimeAsJsonTestCases ) ) ]
253306 public void WriteDateTimeAsJsonShouldMatchExpected ( DateTimeOffset dateTimeOffset , bool produceTerseOutput )
@@ -260,10 +313,7 @@ public void WriteDateTimeAsJsonShouldMatchExpected(DateTimeOffset dateTimeOffset
260313 writer . WriteValue ( dateTimeOffset ) ;
261314
262315 var writtenString = outputString . GetStringBuilder ( ) . ToString ( ) ;
263- var expectedString = JsonConvert . SerializeObject ( dateTimeOffset , new JsonSerializerSettings
264- {
265- DateFormatString = "yyyy-MM-ddTHH:mm:ss.fffffffK" ,
266- } ) ;
316+ var expectedString = JsonSerializer . Serialize ( dateTimeOffset , _jsonSerializerOptions . Value ) ;
267317
268318 // Assert
269319 writtenString . Should ( ) . Be ( expectedString ) ;
0 commit comments