Skip to content

Commit 44f44df

Browse files
author
Oren (electricessence)
committed
Added Newtonsoft.
1 parent 27e66d1 commit 44f44df

20 files changed

Lines changed: 249 additions & 17 deletions

Open.Serialization.Json.Newtonsoft/CamelCaseJson.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public static JsonSerializerSettings Default(bool indent = false)
1515
public static JsonSerializerSettings Minimal(bool indent = false)
1616
{
1717
var options = Default(indent);
18-
options.Formatting = indent ? Formatting.Indented : Formatting.None;
18+
options.NullValueHandling = NullValueHandling.Ignore;
1919
return options;
2020
}
2121
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using Newtonsoft.Json;
2+
3+
namespace Open.Serialization.Json.Newtonsoft.Converters
4+
{
5+
public class JsonDecimalConverter : JsonValueConverterBase<decimal>
6+
{
7+
protected JsonDecimalConverter()
8+
{
9+
// Prevent unnecessary replication.
10+
}
11+
12+
public static readonly JsonDecimalConverter Instance
13+
= new JsonDecimalConverter();
14+
15+
public static string Normalize(decimal? value)
16+
=> Normalize(value?.ToString());
17+
18+
public static string Normalize(string decimalString)
19+
=> decimalString?.IndexOf('.') == -1 ? decimalString
20+
: decimalString?.TrimEnd('0').TrimEnd('.');
21+
22+
public override void WriteJson(JsonWriter writer, decimal value, JsonSerializer serializer)
23+
=> writer.WriteRawValue(Normalize(value));
24+
}
25+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using System;
2+
using Newtonsoft.Json;
3+
4+
namespace Open.Serialization.Json.Newtonsoft.Converters
5+
{
6+
public class JsonDecimalRoundingConverter : JsonDecimalConverter
7+
{
8+
public readonly int Maximum;
9+
public JsonDecimalRoundingConverter(int maximum)
10+
{
11+
if (maximum < 0)
12+
throw new ArgumentOutOfRangeException(nameof(maximum), maximum, "Must be at least zero.");
13+
Maximum = maximum;
14+
}
15+
16+
public override decimal ReadJson(JsonReader reader, Type objectType, decimal existingValue, bool hasExistingValue, JsonSerializer serializer)
17+
=> Math.Round(decimal.Parse((string)reader.Value), Maximum);
18+
19+
public override void WriteJson(JsonWriter writer, decimal value, JsonSerializer serializer)
20+
=> base.WriteJson(writer, Math.Round(value, Maximum), serializer);
21+
}
22+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using System;
2+
using Newtonsoft.Json;
3+
4+
namespace Open.Serialization.Json.Newtonsoft.Converters
5+
{
6+
public class JsonDoubleRoundingConverter : JsonValueConverterBase<double>
7+
{
8+
public readonly int Maximum;
9+
public JsonDoubleRoundingConverter(int maximum)
10+
{
11+
if (maximum < 0)
12+
throw new ArgumentOutOfRangeException(nameof(maximum), maximum, "Must be at least zero.");
13+
Maximum = maximum;
14+
}
15+
16+
public override double ReadJson(JsonReader reader, Type objectType, double existingValue, bool hasExistingValue, JsonSerializer serializer)
17+
=> Math.Round(hasExistingValue ? existingValue : double.Parse((string)reader.Value), Maximum);
18+
19+
public override void WriteJson(JsonWriter writer, double value, JsonSerializer serializer)
20+
=> writer.WriteValue(Math.Round(value, Maximum));
21+
}
22+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using System;
2+
using Newtonsoft.Json;
3+
4+
namespace Open.Serialization.Json.Newtonsoft.Converters
5+
{
6+
public class JsonNullableDecimalConverter : JsonValueConverterBase<decimal?>
7+
{
8+
protected JsonNullableDecimalConverter()
9+
{
10+
// Prevent unnecessary replication.
11+
}
12+
13+
public static readonly JsonNullableDecimalConverter Instance
14+
= new JsonNullableDecimalConverter();
15+
16+
public override decimal? ReadJson(JsonReader reader, Type objectType, decimal? existingValue, bool hasExistingValue, JsonSerializer serializer)
17+
=> hasExistingValue ? existingValue : reader.TokenType switch
18+
{
19+
JsonToken.Null => default,
20+
JsonToken.Float => decimal.Parse((string)reader.Value),
21+
_ => throw new JsonException("Unexpected token type."),
22+
};
23+
24+
public override void WriteJson(JsonWriter writer, decimal? value, JsonSerializer serializer)
25+
=> writer.WriteRawValue(JsonDecimalConverter.Normalize(value));
26+
}
27+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using System;
2+
using Newtonsoft.Json;
3+
4+
namespace Open.Serialization.Json.Newtonsoft.Converters
5+
{
6+
public class JsonNullableDecimalRoundingConverter : JsonNullableDecimalConverter
7+
{
8+
public readonly int Maximum;
9+
public JsonNullableDecimalRoundingConverter(int maximum)
10+
{
11+
if (maximum < 0)
12+
throw new ArgumentOutOfRangeException(nameof(maximum), maximum, "Must be at least zero.");
13+
Maximum = maximum;
14+
}
15+
16+
public override decimal? ReadJson(JsonReader reader, Type objectType, decimal? existingValue, bool hasExistingValue, JsonSerializer serializer)
17+
{
18+
var value = base.ReadJson(reader, objectType, existingValue, hasExistingValue, serializer);
19+
return value.HasValue ? Math.Round(value.Value, Maximum) : value;
20+
}
21+
22+
public override void WriteJson(JsonWriter writer, decimal? value, JsonSerializer serializer)
23+
{
24+
if (value.HasValue)
25+
value = Math.Round(value.Value, Maximum);
26+
27+
base.WriteJson(writer, value, serializer);
28+
}
29+
}
30+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using System;
2+
using Newtonsoft.Json;
3+
4+
namespace Open.Serialization.Json.Newtonsoft.Converters
5+
{
6+
public class JsonNullableDoubleConverter : JsonValueConverterBase<double?>
7+
{
8+
protected JsonNullableDoubleConverter()
9+
{
10+
// Prevent unnecessary replication.
11+
}
12+
13+
public static readonly JsonNullableDoubleConverter Instance
14+
= new JsonNullableDoubleConverter();
15+
16+
17+
public override double? ReadJson(JsonReader reader, Type objectType, double? existingValue, bool hasExistingValue, JsonSerializer serializer)
18+
=> hasExistingValue ? existingValue : reader.TokenType switch
19+
{
20+
JsonToken.Null => default,
21+
JsonToken.Float => double.Parse((string)reader.Value),
22+
_ => throw new JsonException("Unexpected token type."),
23+
};
24+
25+
public override void WriteJson(JsonWriter writer, double? value, JsonSerializer serializer)
26+
{
27+
if (value.HasValue) writer.WriteValue(value.Value);
28+
else writer.WriteRawValue(null);
29+
}
30+
}
31+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using System;
2+
using Newtonsoft.Json;
3+
4+
namespace Open.Serialization.Json.Newtonsoft.Converters
5+
{
6+
public class JsonNullableDoubleRoundingConverter : JsonNullableDoubleConverter
7+
{
8+
public readonly int Maximum;
9+
public JsonNullableDoubleRoundingConverter(int maximum)
10+
{
11+
if (maximum < 0)
12+
throw new ArgumentOutOfRangeException(nameof(maximum), maximum, "Must be at least zero.");
13+
Maximum = maximum;
14+
}
15+
16+
public override double? ReadJson(JsonReader reader, Type objectType, double? existingValue, bool hasExistingValue, JsonSerializer serializer)
17+
{
18+
var value = base.ReadJson(reader, objectType, existingValue, hasExistingValue, serializer);
19+
return value.HasValue ? Math.Round(value.Value, Maximum) : value;
20+
}
21+
22+
public override void WriteJson(JsonWriter writer, double? value, JsonSerializer serializer)
23+
{
24+
if (value.HasValue)
25+
value = Math.Round(value.Value, Maximum);
26+
27+
base.WriteJson(writer, value, serializer);
28+
}
29+
}
30+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using System;
2+
using Newtonsoft.Json;
3+
4+
namespace Open.Serialization.Json.Newtonsoft.Converters
5+
{
6+
public abstract class JsonValueConverterBase<T> : JsonConverter<T>
7+
{
8+
// Avoids stack overflow.
9+
private static readonly JsonSerializer Deserializer = JsonSerializer.Create();
10+
11+
public override T ReadJson(JsonReader reader, Type objectType, T existingValue, bool hasExistingValue, JsonSerializer serializer)
12+
=> hasExistingValue ? existingValue : Deserializer.Deserialize<T>(reader);
13+
14+
public override void WriteJson(JsonWriter writer, T value, JsonSerializer serializer)
15+
=> writer.WriteRawValue(value?.ToString());
16+
}
17+
}

Open.Serialization.Json.Newtonsoft/Extensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
using System.Collections.Generic;
33
using System.Linq;
44
using Newtonsoft.Json;
5-
using Open.Serialization.Json.Newtonsoft;
5+
using Open.Serialization.Json.Newtonsoft.Converters;
66

77
namespace Open.Serialization.Json.Newtonsoft
88
{
@@ -67,7 +67,7 @@ public static JsonSerializerSettings Clone(this JsonSerializerSettings settings)
6767
CheckAdditionalContent = settings.CheckAdditionalContent
6868
};
6969

70-
settings.Converters = settings.Converters ?? new List<JsonConverter>();
70+
settings.Converters ??= new List<JsonConverter>();
7171
foreach (var converter in settings.Converters)
7272
clone.Converters.Add(converter);
7373

0 commit comments

Comments
 (0)