@@ -31,31 +31,38 @@ internal sealed class SpecialNumberConverter : JsonConverter<double>
3131{
3232 public override double Read ( ref Utf8JsonReader reader , Type typeToConvert , JsonSerializerOptions options )
3333 {
34- if ( reader . TryGetDouble ( out double d ) )
34+ switch ( reader . TokenType )
3535 {
36- return d ;
37- }
36+ case JsonTokenType . Number :
37+ return reader . GetDouble ( ) ;
3838
39- var str = reader . GetString ( ) ?? throw new JsonException ( "Cannot convert from null to special number value" ) ;
39+ case JsonTokenType . String :
40+ var str = reader . GetString ( ) ! ;
41+ if ( str . Equals ( "-0" , StringComparison . Ordinal ) )
42+ {
43+ return - 0.0 ;
44+ }
4045
41- if ( str . Equals ( "-0" , StringComparison . Ordinal ) )
42- {
43- return - 0.0 ;
44- }
45- else if ( str . Equals ( "NaN" , StringComparison . Ordinal ) )
46- {
47- return double . NaN ;
48- }
49- else if ( str . Equals ( "Infinity" , StringComparison . Ordinal ) )
50- {
51- return double . PositiveInfinity ;
52- }
53- else if ( str . Equals ( "-Infinity" , StringComparison . Ordinal ) )
54- {
55- return double . NegativeInfinity ;
56- }
46+ if ( str . Equals ( "NaN" , StringComparison . Ordinal ) )
47+ {
48+ return double . NaN ;
49+ }
50+
51+ if ( str . Equals ( "Infinity" , StringComparison . Ordinal ) )
52+ {
53+ return double . PositiveInfinity ;
54+ }
5755
58- throw new JsonException ( ) ;
56+ if ( str . Equals ( "-Infinity" , StringComparison . Ordinal ) )
57+ {
58+ return double . NegativeInfinity ;
59+ }
60+
61+ throw new JsonException ( "JSON string could not be parsed to a special number" ) ;
62+
63+ default :
64+ throw new JsonException ( $ "JSON type not a number or string: { reader . TokenType } ") ;
65+ }
5966 }
6067
6168 public override void Write ( Utf8JsonWriter writer , double value , JsonSerializerOptions options )
0 commit comments