Skip to content

Commit

Permalink
chore: Drop support for Newtonsoft.Json except Bson
Browse files Browse the repository at this point in the history
  • Loading branch information
czgeissler committed Sep 20, 2022
1 parent 96612fb commit b743bb9
Show file tree
Hide file tree
Showing 74 changed files with 729 additions and 1,699 deletions.
1 change: 0 additions & 1 deletion src/Api.Rest.Dtos.Tests/Api.Rest.Dtos.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
<PackageReference Include="FluentAssertions" Version="5.10.3" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.2.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.10.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="NUnit" Version="3.13.2" />
<PackageReference Include="NUnit3TestAdapter" Version="4.0.0">
<PrivateAssets>all</PrivateAssets>
Expand Down
73 changes: 16 additions & 57 deletions src/Api.Rest.Dtos.Tests/Benchmarks/SerializationBenchmark.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ namespace Zeiss.PiWeb.Api.Rest.Dtos.Tests.Benchmarks
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Text.Json;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Configs;
using BenchmarkDotNet.Filters;
Expand Down Expand Up @@ -46,9 +47,9 @@ public class SerializationBenchmark
private static readonly string MeasurementsJson = SerializationTestHelper.ReadResourceString( "Samples.measurements.json" );
private static readonly string ValuesJson = SerializationTestHelper.ReadResourceString( "Samples.values.json" );

private static readonly IReadOnlyList<InspectionPlanCharacteristicDto> Characteristics = Newtonsoft.Json.JsonConvert.DeserializeObject<IReadOnlyList<InspectionPlanCharacteristicDto>>( CharacteristicJson );
private static readonly IReadOnlyList<SimpleMeasurementDto> Measurements = Newtonsoft.Json.JsonConvert.DeserializeObject<IReadOnlyList<SimpleMeasurementDto>>( MeasurementsJson );
private static readonly IReadOnlyList<DataMeasurementDto> Values = Newtonsoft.Json.JsonConvert.DeserializeObject<IReadOnlyList<DataMeasurementDto>>( ValuesJson );
private static readonly IReadOnlyList<InspectionPlanCharacteristicDto> Characteristics = JsonSerializer.Deserialize<IReadOnlyList<InspectionPlanCharacteristicDto>>( CharacteristicJson );
private static readonly IReadOnlyList<SimpleMeasurementDto> Measurements = JsonSerializer.Deserialize<IReadOnlyList<SimpleMeasurementDto>>( MeasurementsJson );
private static readonly IReadOnlyList<DataMeasurementDto> Values = JsonSerializer.Deserialize<IReadOnlyList<DataMeasurementDto>>( ValuesJson );

private static readonly IReadOnlyList<string[]> TestCases = new[]
{
Expand Down Expand Up @@ -98,88 +99,46 @@ private static void ExecuteBenchmarks( params string[] categories )
Console.Out.WriteLine( summary );
}

[Benchmark]
[BenchmarkCategory( SerializationCategory, InspectionPlanCategory, NewtonsoftJsonCategory )]
public string SerializeCharacteristicsNewtonsoftJson()
{
return Newtonsoft.Json.JsonConvert.SerializeObject( Characteristics );
}

[Benchmark]
[BenchmarkCategory( SerializationCategory, InspectionPlanCategory, SystemTextJsonCategory )]
public string SerializeCharacteristicsSystemTextJson()
{
return System.Text.Json.JsonSerializer.Serialize( Characteristics );
}

[Benchmark]
[BenchmarkCategory( SerializationCategory, MeasurementCategory, NewtonsoftJsonCategory )]
public string SerializeMeasurementsNewtonsoftJson()
public string SerializeCharacteristics()
{
return Newtonsoft.Json.JsonConvert.SerializeObject( Measurements );
return JsonSerializer.Serialize( Characteristics );
}

[Benchmark]
[BenchmarkCategory( SerializationCategory, MeasurementCategory, SystemTextJsonCategory )]
public string SerializeMeasurementsSystemTextJson()
{
return System.Text.Json.JsonSerializer.Serialize( Measurements );
}

[Benchmark]
[BenchmarkCategory( SerializationCategory, ValueCategory, NewtonsoftJsonCategory )]
public string SerializeValuesNewtonsoftJson()
public string SerializeMeasurements()
{
return Newtonsoft.Json.JsonConvert.SerializeObject( Values );
return JsonSerializer.Serialize( Measurements );
}

[Benchmark]
[BenchmarkCategory( SerializationCategory, ValueCategory, SystemTextJsonCategory )]
public string SerializeValuesSystemTextJson()
public string SerializeValues()
{
return System.Text.Json.JsonSerializer.Serialize( Values );
}

[Benchmark]
[BenchmarkCategory( DeserializationCategory, InspectionPlanCategory, NewtonsoftJsonCategory )]
public IReadOnlyList<InspectionPlanCharacteristicDto> DeserializeCharacteristicsNewtonsoftJson()
{
return Newtonsoft.Json.JsonConvert.DeserializeObject<IReadOnlyList<InspectionPlanCharacteristicDto>>( CharacteristicJson );
return JsonSerializer.Serialize( Values );
}

[Benchmark]
[BenchmarkCategory( DeserializationCategory, InspectionPlanCategory, SystemTextJsonCategory )]
public IReadOnlyList<InspectionPlanCharacteristicDto> DeserializeCharacteristicsSystemTextJson()
{
return System.Text.Json.JsonSerializer.Deserialize<IReadOnlyList<InspectionPlanCharacteristicDto>>( CharacteristicJson );
}

[Benchmark]
[BenchmarkCategory( DeserializationCategory, MeasurementCategory, NewtonsoftJsonCategory )]
public IReadOnlyList<SimpleMeasurementDto> DeserializeMeasurementsNewtonsoftJson()
public IReadOnlyList<InspectionPlanCharacteristicDto> DeserializeCharacteristics()
{
return Newtonsoft.Json.JsonConvert.DeserializeObject<IReadOnlyList<SimpleMeasurementDto>>( MeasurementsJson );
return JsonSerializer.Deserialize<IReadOnlyList<InspectionPlanCharacteristicDto>>( CharacteristicJson );
}

[Benchmark]
[BenchmarkCategory( DeserializationCategory, MeasurementCategory, SystemTextJsonCategory )]
public IReadOnlyList<SimpleMeasurementDto> DeserializeMeasurementsSystemTextJson()
{
return System.Text.Json.JsonSerializer.Deserialize<IReadOnlyList<SimpleMeasurementDto>>( MeasurementsJson );
}

[Benchmark]
[BenchmarkCategory( DeserializationCategory, ValueCategory, NewtonsoftJsonCategory )]
public IReadOnlyList<DataMeasurementDto> DeserializeValuesNewtonsoftJson()
public IReadOnlyList<SimpleMeasurementDto> DeserializeMeasurements()
{
return Newtonsoft.Json.JsonConvert.DeserializeObject<IReadOnlyList<DataMeasurementDto>>( ValuesJson );
return JsonSerializer.Deserialize<IReadOnlyList<SimpleMeasurementDto>>( MeasurementsJson );
}

[Benchmark]
[BenchmarkCategory( DeserializationCategory, ValueCategory, SystemTextJsonCategory )]
public IReadOnlyList<DataMeasurementDto> DeserializeValuesSystemTextJson()
public IReadOnlyList<DataMeasurementDto> DeserializeValues()
{
return System.Text.Json.JsonSerializer.Deserialize<IReadOnlyList<DataMeasurementDto>>( ValuesJson );
return JsonSerializer.Deserialize<IReadOnlyList<DataMeasurementDto>>( ValuesJson );
}

#endregion
Expand Down
31 changes: 5 additions & 26 deletions src/Api.Rest.Dtos.Tests/Compatibility/CompatibilityTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@ namespace Zeiss.PiWeb.Api.Rest.Dtos.Tests.Compatibility
using System.Linq;
using System.Net.Mime;
using System.Text;
using System.Text.Json;
using NUnit.Framework;
using Zeiss.PiWeb.Api.Rest.Dtos.Converter;
using Zeiss.PiWeb.Api.Rest.Dtos.Data;
using Zeiss.PiWeb.Api.Rest.Dtos.JsonConverters;
using Zeiss.PiWeb.Api.Rest.Dtos.RawData;
using static PiWeb.Api.Definitions.WellKnownKeys;

Expand Down Expand Up @@ -380,43 +380,22 @@ public class CompatibilityTests
}
.ToDictionary( pair => pair.Key, pair => pair.Value );

private static readonly Newtonsoft.Json.JsonSerializerSettings Settings = new()
{
NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore,
Converters = { new Newtonsoft.Json.Converters.VersionConverter(), new InspectionPlanDtoBaseConverter() }
};

private static readonly System.Text.Json.JsonSerializerOptions Options = new()
private static readonly JsonSerializerOptions Options = new()
{
DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull,
Converters = { new JsonInspectionPlanDtoBaseConverter() }
Converters = { new InspectionPlanDtoBaseConverter() }
};

#endregion

#region methods

[TestCaseSource( nameof( TestCases ) )]
public void Backward_Compatible<T>( T value )
{
var json = Newtonsoft.Json.JsonConvert.SerializeObject( value, Settings );

var deserializedValue = System.Text.Json.JsonSerializer.Deserialize<T>( json, Options );

var equatable = EquatableFromType[typeof( T )];

var expected = equatable( value );
var actual = equatable( deserializedValue );

Assert.AreEqual( expected, actual, $"{typeof( T ).Name}" );
}

[TestCaseSource( nameof( TestCases ) )]
public void Forward_Compatible<T>( T value )
{
var json = System.Text.Json.JsonSerializer.Serialize( value, Options );
var json = JsonSerializer.Serialize( value, Options );

var deserializedValue = Newtonsoft.Json.JsonConvert.DeserializeObject<T>( json, Settings );
var deserializedValue = JsonSerializer.Deserialize<T>( json, Options );

var equatable = EquatableFromType[typeof( T )];

Expand Down
12 changes: 4 additions & 8 deletions src/Api.Rest.Dtos.Tests/Data/ConfigurationSerializationTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,9 @@ namespace Zeiss.PiWeb.Api.Rest.Dtos.Tests.Data
{
#region usings

using System;
using System.Collections.Generic;
using System.IO;
using Newtonsoft.Json;
using System.Text.Json;
using NUnit.Framework;
using Zeiss.PiWeb.Api.Definitions;
using Zeiss.PiWeb.Api.Rest.Dtos.Converter;
using Zeiss.PiWeb.Api.Rest.Dtos.Data;

#endregion
Expand All @@ -37,16 +33,16 @@ public class ConfigurationSerializationTests
[Test]
public void SerializingConfiguration_SerializesProperly()
{
var deserialized = JsonConvert.DeserializeObject<ConfigurationDto>( ConfigurationJson );
var serialized = JsonConvert.SerializeObject( deserialized );
var deserialized = JsonSerializer.Deserialize<ConfigurationDto>( ConfigurationJson );
var serialized = JsonSerializer.Serialize( deserialized );

Assert.That( serialized, Is.Not.Null.Or.Empty );
}

[Test]
public void DeserializingConfiguration_RestoresStructureProperly()
{
var deserialized = JsonConvert.DeserializeObject<ConfigurationDto>( ConfigurationJson );
var deserialized = JsonSerializer.Deserialize<ConfigurationDto>( ConfigurationJson );

Assert.That( deserialized, Is.Not.Null );
Assert.That( deserialized.AllAttributes, Has.Exactly( 80 ).Items );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,11 @@

#endregion


namespace Zeiss.PiWeb.Api.Rest.Dtos.Tests.Data.Converter
{
#region usings

using Newtonsoft.Json;
using System.Text.Json;
using NUnit.Framework;
using Zeiss.PiWeb.Api.Rest.Dtos.Converter;
using Zeiss.PiWeb.Api.Rest.Dtos.Data;
Expand All @@ -23,66 +22,62 @@ namespace Zeiss.PiWeb.Api.Rest.Dtos.Tests.Data.Converter
[TestFixture]
public class InspectionPlanDtoBaseConverterTests
{
#region members

private static readonly JsonSerializerOptions Options = new()
{
DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull,
Converters = { new InspectionPlanDtoBaseConverter() }
};

#endregion

#region methods

[Test]
public void Parse_HappyPath_ReturnsInspectionPlanPartDto()
{
var json = "{\"attributes\": {\"1\": \"test\"}," +
"\"path\": \"/\"," +
"\"history\": null," +
"\"charChangeDate\": \"0001-01-01T00:00:00\"," +
"\"uuid\": \"00000000-0000-0000-0000-000000000000\"," +
"\"comment\": null," +
"\"version\": 0," +
"\"timestamp\": \"0001-01-01T00:00:00\"}";

var deserialized = JsonConvert.DeserializeObject<InspectionPlanDtoBase>(
json,
new InspectionPlanDtoBaseConverter() );

Assert.AreEqual( typeof( InspectionPlanPartDto ), deserialized.GetType() );
const string json = "{\"attributes\": {\"1\": \"test\"}," +
"\"path\": \"/\"," +
"\"history\": null," +
"\"charChangeDate\": \"0001-01-01T00:00:00\"," +
"\"uuid\": \"00000000-0000-0000-0000-000000000000\"," +
"\"comment\": null," +
"\"version\": 0," +
"\"timestamp\": \"0001-01-01T00:00:00\"}";

var deserialized = JsonSerializer.Deserialize<InspectionPlanDtoBase>( json, Options );

Assert.That( deserialized, Is.TypeOf<InspectionPlanPartDto>() );
}

[Test]
public void Parse_HappyPath_ReturnsSimplePartDto()
{
var json = "{\"attributes\": {\"1\": \"test\"}," +
"\"path\": \"/\"," +
"\"charChangeDate\": \"0001-01-01T00:00:00\"," +
"\"uuid\": \"00000000-0000-0000-0000-000000000000\"," +
"\"timestamp\": \"0001-01-01T00:00:00\"}";
const string json = "{\"attributes\": {\"1\": \"test\"}," +
"\"path\": \"/\"," +
"\"charChangeDate\": \"0001-01-01T00:00:00\"," +
"\"uuid\": \"00000000-0000-0000-0000-000000000000\"," +
"\"timestamp\": \"0001-01-01T00:00:00\"}";

var deserialized = JsonConvert.DeserializeObject<InspectionPlanDtoBase>(
json,
new InspectionPlanDtoBaseConverter() );
var deserialized = JsonSerializer.Deserialize<InspectionPlanDtoBase>( json, Options );

Assert.AreEqual( typeof( SimplePartDto ), deserialized.GetType() );
Assert.That( deserialized, Is.TypeOf<SimplePartDto>() );
}

[Test]
public void Parse_HappyPath_ReturnsInspectionPlanCharacteristicDto()
{
var json = "{\"attributes\": {\"1\": \"test\"}," +
"\"path\": \"C:/merkmal/\"," +
"\"uuid\": \"00000000-0000-0000-0000-000000000000\"," +
"\"comment\": null," +
"\"version\": 0," +
"\"timestamp\": \"0001-01-01T00:00:00\"}";

var deserialized = JsonConvert.DeserializeObject<InspectionPlanDtoBase>(
json,
new InspectionPlanDtoBaseConverter() );

Assert.AreEqual( typeof( InspectionPlanCharacteristicDto ), deserialized.GetType() );
}
const string json = "{\"attributes\": {\"1\": \"test\"}," +
"\"path\": \"C:/merkmal/\"," +
"\"uuid\": \"00000000-0000-0000-0000-000000000000\"," +
"\"comment\": null," +
"\"version\": 0," +
"\"timestamp\": \"0001-01-01T00:00:00\"}";

[Test]
public void Parse_EmptyJson_ReturnsNull()
{
var deserialized = JsonConvert.DeserializeObject<InspectionPlanDtoBase>( string.Empty, new InspectionPlanDtoBaseConverter() );
var deserialized = JsonSerializer.Deserialize<InspectionPlanDtoBase>( json, Options );

Assert.AreEqual( null, deserialized );
Assert.That( deserialized, Is.TypeOf<InspectionPlanCharacteristicDto>() );
}

#endregion
Expand Down
15 changes: 7 additions & 8 deletions src/Api.Rest.Dtos.Tests/Data/InspectionPlanSerializationTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,7 @@ namespace Zeiss.PiWeb.Api.Rest.Dtos.Tests.Data

using System;
using System.Collections.Generic;
using System.IO;
using Newtonsoft.Json;
using System.Text.Json;
using NUnit.Framework;
using Zeiss.PiWeb.Api.Rest.Dtos.Data;

Expand All @@ -36,25 +35,25 @@ public class InspectionPlanSerializationTests
[Test]
public void SerializingParts_SerializesProperly()
{
var deserialized = JsonConvert.DeserializeObject<IReadOnlyList<InspectionPlanPartDto>>( PartJson );
var serialized = JsonConvert.SerializeObject( deserialized );
var deserialized = JsonSerializer.Deserialize<IReadOnlyList<InspectionPlanPartDto>>( PartJson );
var serialized = JsonSerializer.Serialize( deserialized );

Assert.That( serialized, Is.Not.Null.Or.Empty );
}

[Test]
public void SerializingCharacteristics_SerializesProperly()
{
var deserialized = JsonConvert.DeserializeObject<IReadOnlyList<InspectionPlanCharacteristicDto>>( CharacteristicJson );
var serialized = JsonConvert.SerializeObject( deserialized );
var deserialized = JsonSerializer.Deserialize<IReadOnlyList<InspectionPlanCharacteristicDto>>( CharacteristicJson );
var serialized = JsonSerializer.Serialize( deserialized );

Assert.That( serialized, Is.Not.Null.Or.Empty );
}

[Test]
public void DeserializingParts_RestoresStructureProperly()
{
var deserialized = JsonConvert.DeserializeObject<IReadOnlyList<InspectionPlanPartDto>>( PartJson );
var deserialized = JsonSerializer.Deserialize<IReadOnlyList<InspectionPlanPartDto>>( PartJson );

Assert.That( deserialized, Is.Not.Null );
Assert.That( deserialized, Has.Exactly( 2 ).Items );
Expand Down Expand Up @@ -84,7 +83,7 @@ public void DeserializingParts_RestoresStructureProperly()
[Test]
public void DeserializingCharacteristics_RestoresStructureProperly()
{
var deserialized = JsonConvert.DeserializeObject<IReadOnlyList<InspectionPlanCharacteristicDto>>( CharacteristicJson );
var deserialized = JsonSerializer.Deserialize<IReadOnlyList<InspectionPlanCharacteristicDto>>( CharacteristicJson );

Assert.That( deserialized, Is.Not.Null );
Assert.That( deserialized, Has.Exactly( 45 ).Items );
Expand Down
Loading

0 comments on commit b743bb9

Please sign in to comment.