Skip to content

Commit 839d22d

Browse files
author
Oren (electricessence)
committed
Fixed decimal and double handling. Expanded tests.
1 parent c1f4b6b commit 839d22d

8 files changed

Lines changed: 97 additions & 14 deletions

File tree

Open.Serialization.Json.Newtonsoft/Converters/JsonDecimalRoundingConverter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public JsonDecimalRoundingConverter(int maximum)
1414
}
1515

1616
public override decimal ReadJson(JsonReader reader, Type objectType, decimal existingValue, bool hasExistingValue, JsonSerializer serializer)
17-
=> Math.Round(hasExistingValue ? existingValue : (decimal)reader.Value, Maximum);
17+
=> Math.Round(Convert.ToDecimal(reader.Value), Maximum);
1818

1919
public override void WriteJson(JsonWriter writer, decimal value, JsonSerializer serializer)
2020
=> base.WriteJson(writer, Math.Round(value, Maximum), serializer);

Open.Serialization.Json.Newtonsoft/Converters/JsonDoubleRoundingConverter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public JsonDoubleRoundingConverter(int maximum)
1414
}
1515

1616
public override double ReadJson(JsonReader reader, Type objectType, double existingValue, bool hasExistingValue, JsonSerializer serializer)
17-
=> Math.Round(hasExistingValue ? existingValue : (double)reader.Value, Maximum);
17+
=> Math.Round((double)reader.Value, Maximum);
1818

1919
public override void WriteJson(JsonWriter writer, double value, JsonSerializer serializer)
2020
=> writer.WriteValue(Math.Round(value, Maximum));

Open.Serialization.Json.Newtonsoft/Converters/JsonNullableDecimalConverter.cs

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

1616
public override decimal? ReadJson(JsonReader reader, Type objectType, decimal? existingValue, bool hasExistingValue, JsonSerializer serializer)
17-
=> hasExistingValue ? existingValue : reader.TokenType switch
17+
=> reader.TokenType switch
1818
{
1919
JsonToken.Null => default,
2020
JsonToken.Float => (decimal)reader.Value,

Open.Serialization.Json.Newtonsoft/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

1616

1717
public override double? ReadJson(JsonReader reader, Type objectType, double? existingValue, bool hasExistingValue, JsonSerializer serializer)
18-
=> hasExistingValue ? existingValue : reader.TokenType switch
18+
=> reader.TokenType switch
1919
{
2020
JsonToken.Null => default,
2121
JsonToken.Float => (double)reader.Value,

Open.Serialization.Json.Newtonsoft/Converters/JsonValueConverterBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ public abstract class JsonValueConverterBase<T> : JsonConverter<T>
99
private static readonly JsonSerializer Deserializer = JsonSerializer.Create();
1010

1111
public override T ReadJson(JsonReader reader, Type objectType, T existingValue, bool hasExistingValue, JsonSerializer serializer)
12-
=> hasExistingValue ? existingValue : Deserializer.Deserialize<T>(reader);
12+
=> Deserializer.Deserialize<T>(reader);
1313

1414
public override void WriteJson(JsonWriter writer, T value, JsonSerializer serializer)
1515
=> writer.WriteRawValue(value?.ToString());

Open.Serialization.Json.Newtonsoft/Open.Serialization.Json.Newtonsoft.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ Part of the "Open" set of libraries.
1717
<RepositoryUrl>https://github.com/electricessence/Open.Serialization</RepositoryUrl>
1818
<RepositoryType>git</RepositoryType>
1919
<PackageTags>serialization json newtonsoft</PackageTags>
20-
<Version>1.2.3</Version>
20+
<Version>1.2.4</Version>
2121
</PropertyGroup>
2222

2323
<ItemGroup>
Lines changed: 63 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Open.Serialization.Json.Newtonsoft;
22
using Newtonsoft.Json;
33
using Xunit;
4+
using System.Diagnostics;
45

56
namespace Open.Serialization.Tests.Newtonsoft
67
{
@@ -9,17 +10,71 @@ public static class JsonExtensionTests
910
[Fact]
1011
public static void ValidateJsonExtensions()
1112
{
12-
var basic = new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore };
13+
{
14+
var basic = new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore };
15+
var serializer = basic
16+
.NormalizeDecimals()
17+
.RoundDoubles(2)
18+
.RoundDecimals(2)
19+
.GetSerializer();
1320

14-
basic
21+
var json = serializer.Serialize(SampleModel.Instance);
22+
var obj = serializer.Deserialize<SampleModel>(json);
23+
Assert.NotNull(obj);
24+
}
25+
26+
{
27+
var basic = new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore };
28+
var serializer = basic
29+
.RoundDoubles(2)
30+
.RoundDecimals(2)
31+
.GetSerializer();
32+
33+
var json = serializer.Serialize(SampleModel.Instance);
34+
var obj = serializer.Deserialize<SampleModel>(json);
35+
Assert.NotNull(obj);
36+
}
37+
38+
{
39+
var basic = new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore };
40+
var serializer = basic
41+
.RoundDecimals(2)
42+
.RoundDoubles(2)
43+
.GetSerializer();
44+
45+
var json = serializer.Serialize(SampleModel.Instance);
46+
var obj = serializer.Deserialize<SampleModel>(json);
47+
Assert.NotNull(obj);
48+
}
49+
}
50+
51+
[Fact]
52+
public static void ValidateDecimals()
53+
{
54+
const decimal sample = 0.234567890123456789012345m;
55+
var basic = new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, FloatParseHandling = FloatParseHandling.Decimal };
56+
var serializer = basic
1557
.NormalizeDecimals()
16-
.RoundDoubles(2)
17-
.RoundDecimals(2);
58+
.GetSerializer();
1859

19-
var serializer = basic.GetSerializer();
20-
var json = serializer.Serialize(SampleModel.Instance);
21-
var obj = serializer.Deserialize<SampleModel>(json);
22-
Assert.NotNull(obj);
60+
{
61+
var model = new SampleModel
62+
{
63+
DecimalValue1 = sample
64+
};
65+
var json = serializer.Serialize(model);
66+
Assert.Equal(sample, serializer.Deserialize<SampleModel>(json).DecimalValue1);
67+
}
68+
69+
{
70+
var model = new SampleModel
71+
{
72+
NullableDecimalValue = sample
73+
};
74+
var json = serializer.Serialize(model);
75+
Assert.Equal(sample, serializer.Deserialize<SampleModel>(json).NullableDecimalValue);
76+
}
2377
}
78+
2479
}
2580
}

Open.Serialization.Tests/System/JsonExtensionTests.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,5 +35,33 @@ public static void ValidateJsonExtensions()
3535
var obj = serializer.Deserialize<SampleModel>(json);
3636
Assert.NotNull(obj);
3737
}
38+
39+
[Fact]
40+
public static void ValidateDecimals()
41+
{
42+
const decimal sample = 1.234567890123456789012345m;
43+
var basic = new JsonSerializerOptions() { IgnoreNullValues = true };
44+
var serializer = basic
45+
.NormalizeDecimals()
46+
.GetSerializer();
47+
48+
{
49+
var model = new SampleModel
50+
{
51+
DecimalValue1 = sample
52+
};
53+
var json = serializer.Serialize(model);
54+
Assert.Equal(sample, serializer.Deserialize<SampleModel>(json).DecimalValue1);
55+
}
56+
57+
{
58+
var model = new SampleModel
59+
{
60+
NullableDecimalValue = sample
61+
};
62+
var json = serializer.Serialize(model);
63+
Assert.Equal(sample, serializer.Deserialize<SampleModel>(json).NullableDecimalValue);
64+
}
65+
}
3866
}
3967
}

0 commit comments

Comments
 (0)