diff --git a/Src/Newtonsoft.Json.Tests/JavaScriptConvertTest.cs b/Src/Newtonsoft.Json.Tests/JavaScriptConvertTest.cs index c55af74b..44074958 100644 --- a/Src/Newtonsoft.Json.Tests/JavaScriptConvertTest.cs +++ b/Src/Newtonsoft.Json.Tests/JavaScriptConvertTest.cs @@ -173,5 +173,38 @@ now brown cow?", '"', true); value = 'c'; Assert.AreEqual(@"""c""", JavaScriptConvert.ToString(value)); } + + [Test] + [ExpectedException(typeof(JsonReaderException), ExpectedMessage = "After parsing a value an unexpected character was encoutered: t")] + public void TestInvalidStrings() + { + string orig = @"this is a string ""that has quotes"" "; + + string serialized = JavaScriptConvert.SerializeObject(orig); + + // *** Make string invalid by stripping \" \" + serialized = serialized.Replace(@"\""", "\""); + + string result = JavaScriptConvert.DeserializeObject(serialized); + } + + [Test] + public void DeserializeValueObjects() + { + int i = JavaScriptConvert.DeserializeObject("1"); + Assert.AreEqual(1, i); + + DateTimeOffset d = JavaScriptConvert.DeserializeObject(@"""\/Date(-59011455539000+0000)\/"""); + Assert.AreEqual(new DateTimeOffset(new DateTime(100, 1, 1, 1, 1, 1, DateTimeKind.Utc)), d); + + bool b = JavaScriptConvert.DeserializeObject("true"); + Assert.AreEqual(true, b); + + object n = JavaScriptConvert.DeserializeObject("null"); + Assert.AreEqual(null, n); + + object u = JavaScriptConvert.DeserializeObject("undefined"); + Assert.AreEqual(null, u); + } } } \ No newline at end of file diff --git a/Src/Newtonsoft.Json/JavaScriptConvert.cs b/Src/Newtonsoft.Json/JavaScriptConvert.cs index 6c54dd0f..c5e384c6 100644 --- a/Src/Newtonsoft.Json/JavaScriptConvert.cs +++ b/Src/Newtonsoft.Json/JavaScriptConvert.cs @@ -546,6 +546,9 @@ namespace Newtonsoft.Json using (JsonReader jsonReader = new JsonTextReader(sr)) { deserializedValue = jsonSerializer.Deserialize(jsonReader, type); + + if (jsonReader.Read()) + throw new JsonSerializationException("Additional text found in JSON string after finishing deserializing object."); } return deserializedValue; diff --git a/Src/Newtonsoft.Json/JsonTextReader.cs b/Src/Newtonsoft.Json/JsonTextReader.cs index 5e6bf23b..60617060 100644 --- a/Src/Newtonsoft.Json/JsonTextReader.cs +++ b/Src/Newtonsoft.Json/JsonTextReader.cs @@ -592,6 +592,10 @@ namespace Newtonsoft.Json } while (!end && MoveNext()); + // hit the end of the reader before the number ended. clear the last number value + if (!end) + ClearCurrentChar(); + string number = _buffer.ToString(); object numberValue; JsonToken numberType; @@ -678,9 +682,17 @@ namespace Newtonsoft.Json bool match = MatchValue(value); if (!noTrailingNonSeperatorCharacters) + { return match; + } else - return (match && (!MoveNext() || CurrentIsSeperator())); + { + bool matchAndNoTrainingNonSeperatorCharacters = (match && (!MoveNext() || CurrentIsSeperator())); + if (!CurrentIsSeperator()) + ClearCurrentChar(); + + return matchAndNoTrainingNonSeperatorCharacters; + } } private bool CurrentIsSeperator()