diff --git a/Src/Newtonsoft.Json.Tests/JsonSerializerTest.cs b/Src/Newtonsoft.Json.Tests/JsonSerializerTest.cs index c1bd43cb..665be942 100644 --- a/Src/Newtonsoft.Json.Tests/JsonSerializerTest.cs +++ b/Src/Newtonsoft.Json.Tests/JsonSerializerTest.cs @@ -1024,6 +1024,15 @@ keyword such as type of business."" Assert.AreEqual(1, c.Height); } + [Test] + [ExpectedException(typeof(JsonSerializationException), ExpectedMessage = "Could not find member 'Missing' on object of type 'DoubleClass'")] + public void MissingMemeber() + { + string json = @"{""Missing"":1}"; + + JsonConvert.DeserializeObject(json); + } + [Test] public void SerializeTypeProperty() { diff --git a/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs b/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs index aac7f58f..6735c6fe 100644 --- a/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs +++ b/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs @@ -445,5 +445,29 @@ namespace Newtonsoft.Json.Tests Assert.AreEqual(JsonToken.EndArray, jsonReader.TokenType); } } + + [Test] + [ExpectedException(typeof(JsonReaderException), ExpectedMessage = @"Invalid character after parsing property name. Expected ':' but got: "". Line 3, position 9.")] + public void MissingColon() + { + string json = @"{ + ""A"" : true, + ""B"" ""hello"", // Notice the colon is missing + ""C"" : ""bye"" +}"; + + JsonTextReader reader = new JsonTextReader(new StringReader(json)); + + reader.Read(); + Assert.AreEqual(JsonToken.StartObject, reader.TokenType); + + reader.Read(); + Assert.AreEqual(JsonToken.PropertyName, reader.TokenType); + + reader.Read(); + Assert.AreEqual(JsonToken.Boolean, reader.TokenType); + + reader.Read(); + } } } \ No newline at end of file diff --git a/Src/Newtonsoft.Json/JsonSerializer.cs b/Src/Newtonsoft.Json/JsonSerializer.cs index 511e8ecd..f3b02c95 100644 --- a/Src/Newtonsoft.Json/JsonSerializer.cs +++ b/Src/Newtonsoft.Json/JsonSerializer.cs @@ -423,7 +423,7 @@ namespace Newtonsoft.Json else { if (_missingMemberHandling == MissingMemberHandling.Error) - throw new JsonSerializationException("Could not find member '{0}' on object of type '{1}'".FormatWith(CultureInfo.InvariantCulture, memberName, targetType.GetType().Name)); + throw new JsonSerializationException("Could not find member '{0}' on object of type '{1}'".FormatWith(CultureInfo.InvariantCulture, memberName, targetType.Name)); reader.Skip(); } diff --git a/Src/Newtonsoft.Json/JsonTextReader.cs b/Src/Newtonsoft.Json/JsonTextReader.cs index 6cd83fb2..8786eb45 100644 --- a/Src/Newtonsoft.Json/JsonTextReader.cs +++ b/Src/Newtonsoft.Json/JsonTextReader.cs @@ -275,16 +275,6 @@ namespace Newtonsoft.Json _currentChar = '\0'; } - private bool MoveTo(char value) - { - while (MoveNext()) - { - if (_currentChar == value) - return true; - } - return false; - } - /// /// Reads the next Json token from the stream. /// @@ -424,10 +414,15 @@ namespace Newtonsoft.Json throw CreateJsonReaderException("Invalid property identifier character: {0}. Line {1}, position {2}.", _currentChar, _currentLineNumber, _currentLinePosition); } - // finished property. move to colon if (_currentChar != ':') { - MoveTo(':'); + MoveNext(); + + // finished property. skip any whitespace and move to colon + EatWhitespace(false); + + if (_currentChar != ':') + throw CreateJsonReaderException("Invalid character after parsing property name. Expected ':' but got: {0}. Line {1}, position {2}.", _currentChar, _currentLineNumber, _currentLinePosition); } SetToken(JsonToken.PropertyName, _buffer.ToString());