Skip to content

Commit 23b6046

Browse files
Copiloteiriktsarpalisstephentoub
authored
Fix primitive converters to honor JsonNumberHandling when obtained via GetConverter (#120805)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: eiriktsarpalis <2813363+eiriktsarpalis@users.noreply.github.com> Co-authored-by: stephentoub <2642209+stephentoub@users.noreply.github.com> Co-authored-by: Eirik Tsarpalis <eirik.tsarpalis@gmail.com>
1 parent 6489d36 commit 23b6046

File tree

15 files changed

+498
-3
lines changed

15 files changed

+498
-3
lines changed

src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/ByteConverter.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,22 @@ public ByteConverter()
1616

1717
public override byte Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
1818
{
19+
if (options?.NumberHandling is not null and not JsonNumberHandling.Strict)
20+
{
21+
return ReadNumberWithCustomHandling(ref reader, options.NumberHandling, options);
22+
}
23+
1924
return reader.GetByte();
2025
}
2126

2227
public override void Write(Utf8JsonWriter writer, byte value, JsonSerializerOptions options)
2328
{
29+
if (options?.NumberHandling is not null and not JsonNumberHandling.Strict)
30+
{
31+
WriteNumberWithCustomHandling(writer, value, options.NumberHandling);
32+
return;
33+
}
34+
2435
writer.WriteNumberValue(value);
2536
}
2637

src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/DecimalConverter.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,22 @@ public DecimalConverter()
1515

1616
public override decimal Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
1717
{
18+
if (options?.NumberHandling is not null and not JsonNumberHandling.Strict)
19+
{
20+
return ReadNumberWithCustomHandling(ref reader, options.NumberHandling, options);
21+
}
22+
1823
return reader.GetDecimal();
1924
}
2025

2126
public override void Write(Utf8JsonWriter writer, decimal value, JsonSerializerOptions options)
2227
{
28+
if (options?.NumberHandling is not null and not JsonNumberHandling.Strict)
29+
{
30+
WriteNumberWithCustomHandling(writer, value, options.NumberHandling);
31+
return;
32+
}
33+
2334
writer.WriteNumberValue(value);
2435
}
2536

src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/DoubleConverter.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,22 @@ public DoubleConverter()
1616

1717
public override double Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
1818
{
19+
if (options?.NumberHandling is not null and not JsonNumberHandling.Strict)
20+
{
21+
return ReadNumberWithCustomHandling(ref reader, options.NumberHandling, options);
22+
}
23+
1924
return reader.GetDouble();
2025
}
2126

2227
public override void Write(Utf8JsonWriter writer, double value, JsonSerializerOptions options)
2328
{
29+
if (options?.NumberHandling is not null and not JsonNumberHandling.Strict)
30+
{
31+
WriteNumberWithCustomHandling(writer, value, options.NumberHandling);
32+
return;
33+
}
34+
2435
writer.WriteNumberValue(value);
2536
}
2637

src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/HalfConverter.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ public HalfConverter()
2121

2222
public override Half Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
2323
{
24+
if (options?.NumberHandling is not null and not JsonNumberHandling.Strict)
25+
{
26+
return ReadNumberWithCustomHandling(ref reader, options.NumberHandling, options);
27+
}
28+
2429
if (reader.TokenType != JsonTokenType.Number)
2530
{
2631
ThrowHelper.ThrowInvalidOperationException_ExpectedNumber(reader.TokenType);
@@ -31,6 +36,12 @@ public override Half Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSer
3136

3237
public override void Write(Utf8JsonWriter writer, Half value, JsonSerializerOptions options)
3338
{
39+
if (options?.NumberHandling is not null and not JsonNumberHandling.Strict)
40+
{
41+
WriteNumberWithCustomHandling(writer, value, options.NumberHandling);
42+
return;
43+
}
44+
3445
WriteCore(writer, value);
3546
}
3647

@@ -107,7 +118,12 @@ internal override Half ReadNumberWithCustomHandling(ref Utf8JsonReader reader, J
107118
}
108119
}
109120

110-
return Read(ref reader, Type, options);
121+
if (reader.TokenType != JsonTokenType.Number)
122+
{
123+
ThrowHelper.ThrowInvalidOperationException_ExpectedNumber(reader.TokenType);
124+
}
125+
126+
return ReadCore(ref reader);
111127
}
112128

113129
internal override void WriteNumberWithCustomHandling(Utf8JsonWriter writer, Half value, JsonNumberHandling handling)

src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/Int128Converter.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ public Int128Converter()
2020

2121
public override Int128 Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
2222
{
23+
if (options?.NumberHandling is not null and not JsonNumberHandling.Strict)
24+
{
25+
return ReadNumberWithCustomHandling(ref reader, options.NumberHandling, options);
26+
}
27+
2328
if (reader.TokenType != JsonTokenType.Number)
2429
{
2530
ThrowHelper.ThrowInvalidOperationException_ExpectedNumber(reader.TokenType);
@@ -30,6 +35,12 @@ public override Int128 Read(ref Utf8JsonReader reader, Type typeToConvert, JsonS
3035

3136
public override void Write(Utf8JsonWriter writer, Int128 value, JsonSerializerOptions options)
3237
{
38+
if (options?.NumberHandling is not null and not JsonNumberHandling.Strict)
39+
{
40+
WriteNumberWithCustomHandling(writer, value, options.NumberHandling);
41+
return;
42+
}
43+
3344
WriteCore(writer, value);
3445
}
3546

@@ -84,7 +95,12 @@ internal override Int128 ReadNumberWithCustomHandling(ref Utf8JsonReader reader,
8495
return ReadCore(ref reader);
8596
}
8697

87-
return Read(ref reader, Type, options);
98+
if (reader.TokenType != JsonTokenType.Number)
99+
{
100+
ThrowHelper.ThrowInvalidOperationException_ExpectedNumber(reader.TokenType);
101+
}
102+
103+
return ReadCore(ref reader);
88104
}
89105

90106
internal override void WriteNumberWithCustomHandling(Utf8JsonWriter writer, Int128 value, JsonNumberHandling handling)

src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/Int16Converter.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,22 @@ public Int16Converter()
1616

1717
public override short Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
1818
{
19+
if (options?.NumberHandling is not null and not JsonNumberHandling.Strict)
20+
{
21+
return ReadNumberWithCustomHandling(ref reader, options.NumberHandling, options);
22+
}
23+
1924
return reader.GetInt16();
2025
}
2126

2227
public override void Write(Utf8JsonWriter writer, short value, JsonSerializerOptions options)
2328
{
29+
if (options?.NumberHandling is not null and not JsonNumberHandling.Strict)
30+
{
31+
WriteNumberWithCustomHandling(writer, value, options.NumberHandling);
32+
return;
33+
}
34+
2435
// For performance, lift up the writer implementation.
2536
writer.WriteNumberValue((long)value);
2637
}

src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/Int32Converter.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,22 @@ public Int32Converter()
1616

1717
public override int Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
1818
{
19+
if (options?.NumberHandling is not null and not JsonNumberHandling.Strict)
20+
{
21+
return ReadNumberWithCustomHandling(ref reader, options.NumberHandling, options);
22+
}
23+
1924
return reader.GetInt32();
2025
}
2126

2227
public override void Write(Utf8JsonWriter writer, int value, JsonSerializerOptions options)
2328
{
29+
if (options?.NumberHandling is not null and not JsonNumberHandling.Strict)
30+
{
31+
WriteNumberWithCustomHandling(writer, value, options.NumberHandling);
32+
return;
33+
}
34+
2435
// For performance, lift up the writer implementation.
2536
writer.WriteNumberValue((long)value);
2637
}

src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/Int64Converter.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,22 @@ public Int64Converter()
1616

1717
public override long Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
1818
{
19+
if (options?.NumberHandling is not null and not JsonNumberHandling.Strict)
20+
{
21+
return ReadNumberWithCustomHandling(ref reader, options.NumberHandling, options);
22+
}
23+
1924
return reader.GetInt64();
2025
}
2126

2227
public override void Write(Utf8JsonWriter writer, long value, JsonSerializerOptions options)
2328
{
29+
if (options?.NumberHandling is not null and not JsonNumberHandling.Strict)
30+
{
31+
WriteNumberWithCustomHandling(writer, value, options.NumberHandling);
32+
return;
33+
}
34+
2435
writer.WriteNumberValue(value);
2536
}
2637

src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/SByteConverter.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,22 @@ public SByteConverter()
1616

1717
public override sbyte Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
1818
{
19+
if (options?.NumberHandling is not null and not JsonNumberHandling.Strict)
20+
{
21+
return ReadNumberWithCustomHandling(ref reader, options.NumberHandling, options);
22+
}
23+
1924
return reader.GetSByte();
2025
}
2126

2227
public override void Write(Utf8JsonWriter writer, sbyte value, JsonSerializerOptions options)
2328
{
29+
if (options?.NumberHandling is not null and not JsonNumberHandling.Strict)
30+
{
31+
WriteNumberWithCustomHandling(writer, value, options.NumberHandling);
32+
return;
33+
}
34+
2435
writer.WriteNumberValue(value);
2536
}
2637

src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/SingleConverter.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,22 @@ public SingleConverter()
1717

1818
public override float Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
1919
{
20+
if (options?.NumberHandling is not null and not JsonNumberHandling.Strict)
21+
{
22+
return ReadNumberWithCustomHandling(ref reader, options.NumberHandling, options);
23+
}
24+
2025
return reader.GetSingle();
2126
}
2227

2328
public override void Write(Utf8JsonWriter writer, float value, JsonSerializerOptions options)
2429
{
30+
if (options?.NumberHandling is not null and not JsonNumberHandling.Strict)
31+
{
32+
WriteNumberWithCustomHandling(writer, value, options.NumberHandling);
33+
return;
34+
}
35+
2536
writer.WriteNumberValue(value);
2637
}
2738

0 commit comments

Comments
 (0)