diff --git a/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs b/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs index ddacda56..123d6b27 100644 --- a/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs +++ b/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs @@ -671,5 +671,26 @@ bye", reader.Value); Assert.IsFalse(reader.Read()); } + + [Test] + public void ReadHexidecimalWithAllLetters() + { + string json = @"{""text"":0xabcdef12345}"; + + JsonTextReader reader = new JsonTextReader(new StringReader(json)); + + Assert.IsTrue(reader.Read()); + Assert.AreEqual(JsonToken.StartObject, reader.TokenType); + + Assert.IsTrue(reader.Read()); + Assert.AreEqual(JsonToken.PropertyName, reader.TokenType); + + Assert.IsTrue(reader.Read()); + Assert.AreEqual(JsonToken.Integer, reader.TokenType); + Assert.AreEqual(11806310474565, reader.Value); + + Assert.IsTrue(reader.Read()); + Assert.AreEqual(JsonToken.EndObject, reader.TokenType); + } } } \ No newline at end of file diff --git a/Src/Newtonsoft.Json/JsonTextReader.cs b/Src/Newtonsoft.Json/JsonTextReader.cs index a0286fec..0f0341bf 100644 --- a/Src/Newtonsoft.Json/JsonTextReader.cs +++ b/Src/Newtonsoft.Json/JsonTextReader.cs @@ -671,7 +671,6 @@ namespace Newtonsoft.Json private void ParseNumber(char firstChar) { char currentChar = firstChar; - bool nonBase10 = (firstChar == '0'); // parse until seperator character or end bool end = false; @@ -693,18 +692,17 @@ namespace Newtonsoft.Json object numberValue; JsonToken numberType; - if (number.IndexOf(".", StringComparison.OrdinalIgnoreCase) != -1 - || number.IndexOf("e", StringComparison.OrdinalIgnoreCase) != -1) - { - numberValue = Convert.ToDouble(number, CultureInfo.InvariantCulture); - numberType = JsonToken.Float; - } - else if (nonBase10) + if (firstChar == '0' && !number.StartsWith("0.", StringComparison.OrdinalIgnoreCase)) { numberValue = number.StartsWith("0x", StringComparison.OrdinalIgnoreCase) ? Convert.ToInt64(number, 16) : Convert.ToInt64(number, 8); numberType = JsonToken.Integer; + } + else if (number.IndexOf(".", StringComparison.OrdinalIgnoreCase) != -1 || number.IndexOf("e", StringComparison.OrdinalIgnoreCase) != -1) + { + numberValue = Convert.ToDouble(number, CultureInfo.InvariantCulture); + numberType = JsonToken.Float; } else {