From 5b04a61dd9b5782af45842da254f15bf3cbfd0b7 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Fri, 29 Apr 2016 18:49:22 +1200 Subject: [PATCH] -Fixed JsonReader.ReadAsDouble with a JValue BigInteger --- .../Linq/JTokenReaderTest.cs | 14 ++++++++++++++ Src/Newtonsoft.Json/JsonReader.cs | 18 +++++++++++++++--- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/Src/Newtonsoft.Json.Tests/Linq/JTokenReaderTest.cs b/Src/Newtonsoft.Json.Tests/Linq/JTokenReaderTest.cs index 1a54f5c1..e459fa1c 100644 --- a/Src/Newtonsoft.Json.Tests/Linq/JTokenReaderTest.cs +++ b/Src/Newtonsoft.Json.Tests/Linq/JTokenReaderTest.cs @@ -51,6 +51,20 @@ namespace Newtonsoft.Json.Tests.Linq [TestFixture] public class JTokenReaderTest : TestFixtureBase { +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + [Test] + public void ConvertBigIntegerToDouble() + { + var jObject = JObject.Parse("{ maxValue:10000000000000000000}"); + + JsonReader reader = jObject.CreateReader(); + Assert.IsTrue(reader.Read()); + Assert.IsTrue(reader.Read()); + Assert.AreEqual(10000000000000000000d, reader.ReadAsDouble()); + Assert.IsTrue(reader.Read()); + } +#endif + [Test] public void ErrorTokenIndex() { diff --git a/Src/Newtonsoft.Json/JsonReader.cs b/Src/Newtonsoft.Json/JsonReader.cs index ce71c23e..bae24cff 100644 --- a/Src/Newtonsoft.Json/JsonReader.cs +++ b/Src/Newtonsoft.Json/JsonReader.cs @@ -622,12 +622,24 @@ namespace Newtonsoft.Json case JsonToken.Float: if (!(Value is double)) { - SetToken(JsonToken.Float, Convert.ToDouble(Value, CultureInfo.InvariantCulture), false); + double d; +#if !(NET20 || NET35 || PORTABLE40 || PORTABLE) + if (Value is BigInteger) + { + d = (double)(BigInteger)Value; + } + else +#endif + { + d = Convert.ToDouble(Value, CultureInfo.InvariantCulture); + } + + SetToken(JsonToken.Float, d, false); } - return (double) Value; + return (double)Value; case JsonToken.String: - return ReadDoubleString((string) Value); + return ReadDoubleString((string)Value); } throw JsonReaderException.Create(this, "Error reading double. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, t));