Skip to content

Commit 40ac438

Browse files
author
Oren (electricessence)
committed
Better conversion handling.
Added missing decimal handling.
1 parent 1500d45 commit 40ac438

5 files changed

Lines changed: 55 additions & 21 deletions

File tree

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

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

1616
public override double ReadJson(JsonReader reader, Type objectType, double existingValue, bool hasExistingValue, JsonSerializer serializer)
17-
=> Math.Round((double)reader.Value, Maximum);
17+
=> reader.Value is decimal d
18+
? Convert.ToDouble(Math.Round(d, Maximum))
19+
: Math.Round(Convert.ToDouble(reader.Value), Maximum);
1820

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

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ public static readonly JsonNullableDecimalConverter Instance
1818
{
1919
JsonToken.Null => default,
2020
JsonToken.Float => Convert.ToDecimal(reader.Value),
21-
_ => throw new JsonException("Unexpected token type."),
21+
_ => throw new JsonException($"Unexpected token type: {reader.TokenType}, Actual: {reader.Value.GetType()}")
2222
};
2323

24-
public override void WriteJson(JsonWriter writer, decimal? value, JsonSerializer serializer)
25-
=> writer.WriteRawValue(JsonDecimalConverter.Normalize(value));
24+
public override void WriteJson(JsonWriter writer, decimal? value, JsonSerializer serializer)
25+
=> writer.WriteRawValue(JsonDecimalConverter.Normalize(value));
2626
}
2727
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ public static readonly JsonNullableDoubleConverter Instance
1818
=> reader.TokenType switch
1919
{
2020
JsonToken.Null => default,
21-
JsonToken.Float => (double)reader.Value,
22-
_ => throw new JsonException("Unexpected token type."),
21+
JsonToken.Float => Convert.ToDouble(reader.Value),
22+
_ => throw new JsonException($"Unexpected token type: {reader.TokenType}, Actual: {reader.Value.GetType()}")
2323
};
2424

2525
public override void WriteJson(JsonWriter writer, double? value, JsonSerializer serializer)

Open.Serialization.Json.Newtonsoft/RelaxedJson.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ internal static JsonSerializerSettings Options(
1111
=> new JsonSerializerSettings()
1212
{
1313
Formatting = indent ? Formatting.Indented : Formatting.None,
14+
FloatParseHandling = FloatParseHandling.Decimal,
1415
ContractResolver = new DefaultContractResolver()
1516
{
1617
NamingStrategy = new DefaultNamingStrategy() { ProcessDictionaryKeys = false }

Open.Serialization.Tests/Newtonsoft/JsonExtensionTests.cs

Lines changed: 46 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using Newtonsoft.Json;
33
using Xunit;
44
using System.Diagnostics;
5+
using System;
56

67
namespace Open.Serialization.Tests.Newtonsoft
78
{
@@ -52,28 +53,58 @@ public static void ValidateJsonExtensions()
5253
public static void ValidateDecimals()
5354
{
5455
const decimal sample = 0.234567890123456789012345m;
55-
var basic = new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, FloatParseHandling = FloatParseHandling.Decimal };
56-
var serializer = basic
57-
.NormalizeDecimals()
58-
.GetSerializer();
59-
6056
{
61-
var model = new SampleModel
57+
var serializer = CamelCaseJson
58+
.Default()
59+
.NormalizeDecimals()
60+
.GetSerializer();
61+
6262
{
63-
DecimalValue1 = sample
64-
};
65-
var json = serializer.Serialize(model);
66-
Assert.Equal(sample, serializer.Deserialize<SampleModel>(json).DecimalValue1);
63+
var model = new SampleModel
64+
{
65+
DecimalValue1 = sample
66+
};
67+
var json = serializer.Serialize(model);
68+
Assert.Equal(sample, serializer.Deserialize<SampleModel>(json).DecimalValue1);
69+
}
70+
71+
{
72+
var model = new SampleModel
73+
{
74+
NullableDecimalValue = sample
75+
};
76+
var json = serializer.Serialize(model);
77+
Assert.Equal(sample, serializer.Deserialize<SampleModel>(json).NullableDecimalValue);
78+
}
6779
}
6880

6981
{
70-
var model = new SampleModel
82+
var serializer = CamelCaseJson
83+
.Default()
84+
.RoundDecimals(2)
85+
.GetSerializer();
86+
87+
var sample2 = Math.Round(sample, 2);
88+
7189
{
72-
NullableDecimalValue = sample
73-
};
74-
var json = serializer.Serialize(model);
75-
Assert.Equal(sample, serializer.Deserialize<SampleModel>(json).NullableDecimalValue);
90+
var model = new SampleModel
91+
{
92+
DecimalValue1 = sample
93+
};
94+
var json = serializer.Serialize(model);
95+
Assert.Equal(sample2, serializer.Deserialize<SampleModel>(json).DecimalValue1);
96+
}
97+
98+
{
99+
var model = new SampleModel
100+
{
101+
NullableDecimalValue = sample
102+
};
103+
var json = serializer.Serialize(model);
104+
Assert.Equal(sample2, serializer.Deserialize<SampleModel>(json).NullableDecimalValue);
105+
}
76106
}
107+
77108
}
78109

79110
}

0 commit comments

Comments
 (0)