diff --git a/src/SimpleJson.Tests/JsonDecodeTypeTests.cs b/src/SimpleJson.Tests/JsonDecodeTypeTests.cs index 82422d3..921ebe9 100644 --- a/src/SimpleJson.Tests/JsonDecodeTypeTests.cs +++ b/src/SimpleJson.Tests/JsonDecodeTypeTests.cs @@ -148,6 +148,34 @@ public void GivenNumberWithDecimalTypeIsDouble() var json = "10.2"; var result = SimpleJson.DeserializeObject(json); +#if NETFX_CORE + Assert.IsInstanceOfType(result, typeof(double)); +#else + Assert.IsInstanceOf(result); +#endif + } + + [TestMethod] + public void GivenNumberWithoutDecimalTooLargeForLongTypeIsDecimal() + { + decimal veryLargeInteger = long.MaxValue + 1M; + var json = veryLargeInteger.ToString(); + object result = SimpleJson.DeserializeObject(json); + +#if NETFX_CORE + Assert.IsInstanceOfType(result, typeof(decimal)); +#else + Assert.IsInstanceOf(result); +#endif + } + + [TestMethod] + public void GivenNumberWithoutDecimalTooLargeForDecimalTypeIsDouble() + { + decimal veryVeryLargeInteger = decimal.MaxValue; + var json = veryVeryLargeInteger + "0"; // Tack a zero onto the end -- multiply by 10 + object result = SimpleJson.DeserializeObject(json); + #if NETFX_CORE Assert.IsInstanceOfType(result, typeof(double)); #else diff --git a/src/SimpleJson/SimpleJson.cs b/src/SimpleJson/SimpleJson.cs index 2ab9742..4b65166 100644 --- a/src/SimpleJson/SimpleJson.cs +++ b/src/SimpleJson/SimpleJson.cs @@ -897,19 +897,29 @@ static object ParseNumber(char[] json, ref int index, ref bool success) EatWhitespace(json, ref index); int lastIndex = GetLastIndexOfNumber(json, index); int charLength = (lastIndex - index) + 1; - object returnNumber; - string str = new string(json, index, charLength); - if (str.IndexOf(".", StringComparison.OrdinalIgnoreCase) != -1 || str.IndexOf("e", StringComparison.OrdinalIgnoreCase) != -1) + object returnNumber = null; + string numberAsString = new string(json, index, charLength); + if ((numberAsString.IndexOf(".", StringComparison.OrdinalIgnoreCase) != -1) + || (numberAsString.IndexOf("e", StringComparison.OrdinalIgnoreCase) != -1)) { double number; - success = double.TryParse(new string(json, index, charLength), NumberStyles.Any, CultureInfo.InvariantCulture, out number); + success = double.TryParse(numberAsString, NumberStyles.Any, CultureInfo.InvariantCulture, out number); returnNumber = number; } else { - long number; - success = long.TryParse(new string(json, index, charLength), NumberStyles.Any, CultureInfo.InvariantCulture, out number); - returnNumber = number; + long longNumber; + decimal decimalNumber; + double doubleNumber; + + if (long.TryParse(numberAsString, NumberStyles.Any, CultureInfo.InvariantCulture, out longNumber)) + returnNumber = longNumber; + else if (decimal.TryParse(numberAsString, NumberStyles.Any, CultureInfo.InvariantCulture, out decimalNumber)) + returnNumber = decimalNumber; + else if (double.TryParse(numberAsString, NumberStyles.Any, CultureInfo.InvariantCulture, out doubleNumber)) + returnNumber = doubleNumber; + + success = (returnNumber != null); } index = lastIndex + 1; return returnNumber;