From abd8da25a7967c642cd7f2de966b81457521ad67 Mon Sep 17 00:00:00 2001 From: JamesNK Date: Sun, 2 Mar 2008 04:04:04 +0000 Subject: [PATCH] Added JsonTextReader support for NaN, PositiveInfinity and NegativeInfinity constants. --- .../JsonTextReaderTest.cs | 33 +++++++++++++ .../JsonTextWriterTest.cs | 33 +++++++++++++ Src/Newtonsoft.Json/JavaScriptConvert.cs | 18 +++++++ Src/Newtonsoft.Json/JsonTextReader.cs | 48 +++++++++++++++++++ 4 files changed, 132 insertions(+) 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. ///