Skip to content

Commit 71ea48a

Browse files
author
Oren (electricessence)
committed
Established parity between Newtonsoft and STJ.
1 parent 44f44df commit 71ea48a

11 files changed

Lines changed: 153 additions & 20 deletions

File tree

Open.Serialization.Json.Newtonsoft/CamelCaseJson.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ public static class CamelCaseJson
88
public static JsonSerializerSettings Default(bool indent = false)
99
{
1010
var options = RelaxedJson.Options(indent);
11-
options.ContractResolver = new CamelCasePropertyNamesContractResolver();
11+
options.ContractResolver = new CamelCasePropertyNamesContractResolver()
12+
{
13+
NamingStrategy = new CamelCaseNamingStrategy() { ProcessDictionaryKeys = false }
14+
};
1215
return options;
1316
}
1417

Open.Serialization.Json.Newtonsoft/RelaxedJson.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Newtonsoft.Json;
2+
using Newtonsoft.Json.Serialization;
23
using Open.Serialization.Json.Newtonsoft.Converters;
34

45
namespace Open.Serialization.Json.Newtonsoft
@@ -9,7 +10,11 @@ internal static JsonSerializerSettings Options(
910
bool indent = false)
1011
=> new JsonSerializerSettings()
1112
{
12-
Formatting = indent ? Formatting.Indented : Formatting.None
13+
Formatting = indent ? Formatting.Indented : Formatting.None,
14+
ContractResolver = new DefaultContractResolver()
15+
{
16+
NamingStrategy = new DefaultNamingStrategy() { ProcessDictionaryKeys = false }
17+
}
1318
}
1419
.AddConverter(JsonNullableDoubleConverter.Instance)
1520
.NormalizeDecimals();

Open.Serialization.Json.System/Converters/JsonNullableDoubleConverter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public static readonly JsonNullableDoubleConverter Instance
1515
= new JsonNullableDoubleConverter();
1616

1717
public override bool CanConvert(Type objectType)
18-
=> objectType == typeof(double?) || objectType == typeof(double);
18+
=> objectType == typeof(double?);
1919

2020
public override double? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
2121
=> reader.TokenType switch

Open.Serialization.Json.System/Open.Serialization.Json.System.csproj

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,18 @@
77
<Authors>electricessence</Authors>
88
<Company>electricessence</Company>
99
<Description>
10-
Extentions and DI utilities for System.Text.Json.
10+
Extentions and DI utilities for System.Text.Json.
1111

12-
Part of the "Open" set of libraries.
12+
Part of the "Open" set of libraries.
1313
</Description>
1414
<Copyright>https://github.com/electricessence/Open.Serialization/blob/master/LICENSE</Copyright>
1515
<PackageLicenseExpression>MIT</PackageLicenseExpression>
1616
<PackageProjectUrl>https://github.com/electricessence/Open.Serialization</PackageProjectUrl>
1717
<RepositoryUrl>https://github.com/electricessence/Open.Serialization</RepositoryUrl>
1818
<RepositoryType>git</RepositoryType>
1919
<PackageTags>serialization json stj</PackageTags>
20-
<Version>1.0.1</Version> </PropertyGroup>
20+
<Version>1.0.1</Version>
21+
</PropertyGroup>
2122

2223
<ItemGroup>
2324
<PackageReference Include="Open.Serialization.Json" Version="1.0.1" />

Open.Serialization.Json.System/RelaxedJson.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ internal static JsonSerializerOptions Options(
1313
{
1414
PropertyNameCaseInsensitive = !caseSensitive,
1515
AllowTrailingCommas = true,
16-
WriteIndented = indent,
16+
WriteIndented = indent
1717
}
1818
.AddConverter(JsonNullableDoubleConverter.Instance)
1919
.NormalizeDecimals();
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using Open.Serialization.Json.Newtonsoft;
2+
using Newtonsoft.Json;
3+
using Xunit;
4+
5+
namespace Open.Serialization.Tests.Newtonsoft
6+
{
7+
public static class JsonExtensionTests
8+
{
9+
[Fact]
10+
public static void ValidateJsonExtensions()
11+
{
12+
var basic = new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore };
13+
14+
basic
15+
.NormalizeDecimals()
16+
.RoundDoubles(2)
17+
.RoundDecimals(2);
18+
}
19+
}
20+
}

Open.Serialization.Tests/Open.Serialization.Tests.csproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,10 @@
1313
<PackageReference Include="coverlet.collector" Version="1.0.1" />
1414
</ItemGroup>
1515

16+
<ItemGroup>
17+
<ProjectReference Include="..\Open.Serialization.Json.Newtonsoft\Open.Serialization.Json.Newtonsoft.csproj" />
18+
<ProjectReference Include="..\Open.Serialization.Json.System\Open.Serialization.Json.System.csproj" />
19+
<ProjectReference Include="..\Open.Serialization.Json.Utf8Json\Open.Serialization.Json.Utf8Json.csproj" />
20+
</ItemGroup>
21+
1622
</Project>
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using Open.Serialization.Json;
2+
using Xunit;
3+
4+
namespace Open.Serialization.Tests
5+
{
6+
public static class ParityTests
7+
{
8+
[Fact]
9+
public static void EnsureBasicParity()
10+
{
11+
{
12+
var newtonsoftFactory = new Json.Newtonsoft.JsonSerializerFactory(Json.Newtonsoft.CamelCaseJson.Minimal(true));
13+
var systemFactory = new Json.System.JsonSerializerFactory(Json.System.CamelCaseJson.Minimal(true));
14+
15+
CompareFactories(newtonsoftFactory, systemFactory);
16+
}
17+
18+
{
19+
var newtonsoftFactory = new Json.Newtonsoft.JsonSerializerFactory();
20+
var systemFactory = new Json.System.JsonSerializerFactory();
21+
22+
CompareFactories(newtonsoftFactory, systemFactory);
23+
}
24+
}
25+
26+
static void CompareFactories(IJsonSerializerFactory expectedFactory, IJsonSerializerFactory actualFactory)
27+
{
28+
var expectedSerializer = expectedFactory.GetSerializer();
29+
var actualSerializer = actualFactory.GetSerializer();
30+
31+
Assert.Equal(expectedSerializer.Serialize(SampleModel.Instance), actualSerializer.Serialize(SampleModel.Instance));
32+
Assert.Equal(expectedSerializer.Serialize(SampleModel.DecimalList), actualSerializer.Serialize(SampleModel.DecimalList));
33+
Assert.Equal(expectedSerializer.Serialize(SampleModel.DecimalLookup), actualSerializer.Serialize(SampleModel.DecimalLookup));
34+
Assert.Equal(expectedSerializer.Serialize(SampleModel.DoubleLookup), actualSerializer.Serialize(SampleModel.DoubleLookup));
35+
36+
expectedFactory.GetDeserializer().Deserialize<SampleModel>(actualSerializer.Serialize(SampleModel.Instance));
37+
actualFactory.GetDeserializer().Deserialize<SampleModel>(expectedSerializer.Serialize(SampleModel.Instance));
38+
}
39+
}
40+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
using System.Collections.Generic;
2+
3+
namespace Open.Serialization.Tests
4+
{
5+
public class SampleModel
6+
{
7+
public static IList<decimal?> DecimalList = new decimal?[] { 3.45678m, 45.6789m, null };
8+
9+
public static IDictionary<string, decimal?> DecimalLookup { get; set; } = new SortedDictionary<string, decimal?> { { "NumberOne", 1.2345m }, { "NumberTwo", 2345.6m } };
10+
11+
public static IDictionary<string, double?> DoubleLookup { get; set; } = new SortedDictionary<string, double?> { { "NumberOne", 1.2345 }, { "NumberTwo", 2345.6 } };
12+
13+
public int IntegerValue { get; set; } = 11;
14+
15+
public double DoubleValue { get; set; } = 1.2345678901234567891234;
16+
public decimal DecimalValue1 { get; set; } = 1.2345678901234567891234m;
17+
18+
public decimal DecimalValue2 { get; set; } = 1.2345000m;
19+
public decimal DecimalValue3 { get; set; } = 11.000m;
20+
21+
public string StringValue { get; set; } = "Hello";
22+
public string StringValueNull { get; set; } = null;
23+
24+
public int? NullableIntegerValue { get; set; } = 11;
25+
public int? NullableIntegerNull { get; set; } = null;
26+
27+
public double? NullableDoubleNull { get; set; } = null;
28+
29+
public double? NullableDoubleValue { get; set; } = 1.2345678901234567891234;
30+
public decimal? NullableDecimalValue { get; set; } = 1.2345678901234567891234m;
31+
public decimal? NullableDecimalNull { get; set; } = null;
32+
33+
public SampleModel Child { get; set; }
34+
35+
public static readonly SampleModel Instance = new SampleModel() { Child = new SampleModel() };
36+
}
37+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using Open.Serialization.Json.System;
2+
using Open.Serialization.Json.System.Converters;
3+
using System.Text.Json;
4+
using Xunit;
5+
6+
namespace Open.Serialization.Tests.System
7+
{
8+
public static class JsonExtensionTests
9+
{
10+
[Fact]
11+
public static void ValidateJsonExtensions()
12+
{
13+
var basic = new JsonSerializerOptions() { IgnoreNullValues = true };
14+
var converter = basic.GetConverter(typeof(decimal));
15+
Assert.NotNull(converter);
16+
17+
converter = basic.GetConverter(typeof(decimal?));
18+
Assert.Null(converter);
19+
20+
basic.Converters.Add(JsonDecimalConverter.Instance);
21+
converter = basic.GetConverter(typeof(decimal));
22+
Assert.True(converter is JsonDecimalConverter);
23+
24+
basic.RoundDecimals(2);
25+
converter = basic.GetConverter(typeof(decimal));
26+
Assert.True(converter is JsonDecimalRoundingConverter);
27+
28+
basic
29+
.NormalizeDecimals()
30+
.RoundDoubles(2)
31+
.RoundDecimals(2);
32+
}
33+
}
34+
}

0 commit comments

Comments
 (0)