diff --git a/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs b/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs
index c521df24..05c9f302 100644
--- a/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs
+++ b/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs
@@ -215,5 +215,38 @@ namespace Newtonsoft.Json.Tests
Assert.AreEqual(json, sb.ToString());
}
+
+ [Test]
+ public void FloatingPointNonFiniteNumbers()
+ {
+ string input = @"[
+ NaN,
+ Infinity,
+ -Infinity
+]";
+
+ StringReader sr = new StringReader(input);
+
+ using (JsonReader jsonReader = new JsonTextReader(sr))
+ {
+ jsonReader.Read();
+ Assert.AreEqual(jsonReader.TokenType, JsonToken.StartArray);
+
+ jsonReader.Read();
+ Assert.AreEqual(jsonReader.TokenType, JsonToken.Float);
+ Assert.AreEqual(jsonReader.Value, double.NaN);
+
+ jsonReader.Read();
+ Assert.AreEqual(jsonReader.TokenType, JsonToken.Float);
+ Assert.AreEqual(jsonReader.Value, double.PositiveInfinity);
+
+ jsonReader.Read();
+ Assert.AreEqual(jsonReader.TokenType, JsonToken.Float);
+ Assert.AreEqual(jsonReader.Value, double.NegativeInfinity);
+
+ jsonReader.Read();
+ Assert.AreEqual(jsonReader.TokenType, JsonToken.EndArray);
+ }
+ }
}
}
\ No newline at end of file
diff --git a/Src/Newtonsoft.Json.Tests/JsonTextWriterTest.cs b/Src/Newtonsoft.Json.Tests/JsonTextWriterTest.cs
index 1090a2f8..953323dd 100644
--- a/Src/Newtonsoft.Json.Tests/JsonTextWriterTest.cs
+++ b/Src/Newtonsoft.Json.Tests/JsonTextWriterTest.cs
@@ -172,5 +172,38 @@ namespace Newtonsoft.Json.Tests
Assert.AreEqual(WriteState.Start, jsonWriter.WriteState);
}
}
+
+ [Test]
+ public void FloatingPointNonFiniteNumbers()
+ {
+ StringBuilder sb = new StringBuilder();
+ StringWriter sw = new StringWriter(sb);
+
+ using (JsonWriter jsonWriter = new JsonTextWriter(sw))
+ {
+ jsonWriter.Formatting = Formatting.Indented;
+
+ jsonWriter.WriteStartArray();
+ jsonWriter.WriteValue(double.NaN);
+ jsonWriter.WriteValue(double.PositiveInfinity);
+ jsonWriter.WriteValue(double.NegativeInfinity);
+ jsonWriter.WriteValue(float.NaN);
+ jsonWriter.WriteValue(float.PositiveInfinity);
+ jsonWriter.WriteValue(float.NegativeInfinity);
+ jsonWriter.WriteEndArray();
+ }
+
+ string expected = @"[
+ NaN,
+ Infinity,
+ -Infinity,
+ NaN,
+ Infinity,
+ -Infinity
+]";
+ string result = sb.ToString();
+
+ Assert.AreEqual(expected, result);
+ }
}
}
\ No newline at end of file
diff --git a/Src/Newtonsoft.Json/JavaScriptConvert.cs b/Src/Newtonsoft.Json/JavaScriptConvert.cs
index f91d0532..8729e0f8 100644
--- a/Src/Newtonsoft.Json/JavaScriptConvert.cs
+++ b/Src/Newtonsoft.Json/JavaScriptConvert.cs
@@ -65,6 +65,21 @@ namespace Newtonsoft.Json
///
public static readonly string Undefined;
+ ///
+ /// Represents JavaScript's positive infinity as a string. This field is read-only.
+ ///
+ public static readonly string PositiveInfinity;
+
+ ///
+ /// Represents JavaScript's negative infinity as a string. This field is read-only.
+ ///
+ public static readonly string NegativeInfinity;
+
+ ///
+ /// Represents JavaScript's NaN as a string. This field is read-only.
+ ///
+ public static readonly string NaN;
+
internal static long InitialJavaScriptDateTicks;
internal static DateTime MinimumJavaScriptDate;
@@ -74,6 +89,9 @@ namespace Newtonsoft.Json
False = "false";
Null = "null";
Undefined = "undefined";
+ PositiveInfinity = "Infinity";
+ NegativeInfinity = "-Infinity";
+ NaN = "NaN";
InitialJavaScriptDateTicks = (new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).Ticks;
MinimumJavaScriptDate = new DateTime(100, 1, 1);
diff --git a/Src/Newtonsoft.Json/JsonTextReader.cs b/Src/Newtonsoft.Json/JsonTextReader.cs
index 1a8d9f35..d42afe9d 100644
--- a/Src/Newtonsoft.Json/JsonTextReader.cs
+++ b/Src/Newtonsoft.Json/JsonTextReader.cs
@@ -477,6 +477,18 @@ namespace Newtonsoft.Json
throw new JsonReaderException("Unexpected end");
}
return true;
+ case 'N':
+ ParseNumberNaN();
+ return true;
+ case 'I':
+ ParseNumberPositiveInfinity();
+ return true;
+ case '-':
+ if (PeekNext() == 'I')
+ ParseNumberNegativeInfinity();
+ else
+ ParseNumber();
+ return true;
case '/':
ParseComment();
return true;
@@ -738,6 +750,42 @@ namespace Newtonsoft.Json
}
}
+ private void ParseNumberNegativeInfinity()
+ {
+ if (MatchValue(JavaScriptConvert.NegativeInfinity, true))
+ {
+ SetToken(JsonToken.Float, double.NegativeInfinity);
+ }
+ else
+ {
+ throw new JsonReaderException("Error parsing negative infinity value.");
+ }
+ }
+
+ private void ParseNumberPositiveInfinity()
+ {
+ if (MatchValue(JavaScriptConvert.PositiveInfinity, true))
+ {
+ SetToken(JsonToken.Float, double.PositiveInfinity);
+ }
+ else
+ {
+ throw new JsonReaderException("Error parsing positive infinity value.");
+ }
+ }
+
+ private void ParseNumberNaN()
+ {
+ if (MatchValue(JavaScriptConvert.NaN, true))
+ {
+ SetToken(JsonToken.Float, double.NaN);
+ }
+ else
+ {
+ throw new JsonReaderException("Error parsing NaN value.");
+ }
+ }
+
///
/// Changes the to Closed.
///