Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Drop support for Newtonsoft.Json except Bson #177

Open
wants to merge 1 commit into
base: develop
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
chore: Drop support for Newtonsoft.Json except Bson
czgeissler committed Sep 20, 2022

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
commit b743bb985b7680f2798d14dc12a5122377a1184c
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
@@ -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>
73 changes: 16 additions & 57 deletions src/Api.Rest.Dtos.Tests/Benchmarks/SerializationBenchmark.cs
Original file line number Diff line number Diff line change
@@ -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;
@@ -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[]
{
@@ -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
31 changes: 5 additions & 26 deletions src/Api.Rest.Dtos.Tests/Compatibility/CompatibilityTests.cs
Original file line number Diff line number Diff line change
@@ -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;

@@ -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 )];

12 changes: 4 additions & 8 deletions src/Api.Rest.Dtos.Tests/Data/ConfigurationSerializationTests.cs
Original file line number Diff line number Diff line change
@@ -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
@@ -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 );
Original file line number Diff line number Diff line change
@@ -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;
@@ -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
15 changes: 7 additions & 8 deletions src/Api.Rest.Dtos.Tests/Data/InspectionPlanSerializationTests.cs
Original file line number Diff line number Diff line change
@@ -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;

@@ -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 );
@@ -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 );
Loading