8
8
using System . IO ;
9
9
using System . Linq ;
10
10
using System . Text ;
11
+ using System . Text . Encodings . Web ;
12
+ using System . Text . Json ;
11
13
using System . Text . Json . Nodes ;
14
+ using System . Text . Json . Serialization ;
12
15
using FluentAssertions ;
13
16
using Microsoft . OpenApi . Any ;
14
17
using Microsoft . OpenApi . Models ;
15
18
using Microsoft . OpenApi . Writers ;
16
- using Newtonsoft . Json ;
17
19
using Xunit ;
18
20
19
21
namespace Microsoft . OpenApi . Tests . Writers
@@ -62,9 +64,9 @@ public void WriteStringListAsJsonShouldMatchExpected(string[] stringValues, bool
62
64
writer . WriteEndArray ( ) ;
63
65
writer . Flush ( ) ;
64
66
65
- var parsedObject = JsonConvert . DeserializeObject ( outputString . GetStringBuilder ( ) . ToString ( ) ) ;
67
+ var parsedObject = JsonSerializer . Deserialize < List < string > > ( outputString . GetStringBuilder ( ) . ToString ( ) ) ;
66
68
var expectedObject =
67
- JsonConvert . DeserializeObject ( JsonConvert . SerializeObject ( new List < string > ( stringValues ) ) ) ;
69
+ JsonSerializer . Deserialize < List < string > > ( JsonSerializer . Serialize ( new List < string > ( stringValues ) ) ) ;
68
70
69
71
// Assert
70
72
parsedObject . Should ( ) . BeEquivalentTo ( expectedObject ) ;
@@ -222,17 +224,17 @@ private void WriteValueRecursive(OpenApiJsonWriter writer, object value)
222
224
public void WriteMapAsJsonShouldMatchExpected ( IDictionary < string , object > inputMap , bool produceTerseOutput )
223
225
{
224
226
// Arrange
225
- var outputString = new StringWriter ( CultureInfo . InvariantCulture ) ;
227
+ using var outputString = new StringWriter ( CultureInfo . InvariantCulture ) ;
226
228
var writer = new OpenApiJsonWriter ( outputString , new ( ) { Terse = produceTerseOutput } ) ;
227
229
228
230
// Act
229
231
WriteValueRecursive ( writer , inputMap ) ;
230
232
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 ) ) ;
233
235
234
236
// Assert
235
- parsedObject . Should ( ) . BeEquivalentTo ( expectedObject ) ;
237
+ Assert . True ( JsonElement . DeepEquals ( parsedObject . RootElement , expectedObject . RootElement ) ) ;
236
238
}
237
239
238
240
public static IEnumerable < object [ ] > WriteDateTimeAsJsonTestCases ( )
@@ -248,6 +250,57 @@ from shouldBeTerse in shouldProduceTerseOutputValues
248
250
select new object [ ] { input , shouldBeTerse } ;
249
251
}
250
252
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
+
251
304
[ Theory ]
252
305
[ MemberData ( nameof ( WriteDateTimeAsJsonTestCases ) ) ]
253
306
public void WriteDateTimeAsJsonShouldMatchExpected ( DateTimeOffset dateTimeOffset , bool produceTerseOutput )
@@ -260,10 +313,7 @@ public void WriteDateTimeAsJsonShouldMatchExpected(DateTimeOffset dateTimeOffset
260
313
writer . WriteValue ( dateTimeOffset ) ;
261
314
262
315
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 ) ;
267
317
268
318
// Assert
269
319
writtenString . Should ( ) . Be ( expectedString ) ;
0 commit comments