From 172c1d8f30913eae0431ca2eebb5eaf3b154243d Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Sat, 3 Oct 2015 17:11:45 +1300 Subject: [PATCH] -Fixed inconsistent JsonTextReader.LinePosition -Fixed JsonReader.Path with escaped property names --- .../Converters/XmlNodeConverterTest.cs | 6 +- .../JsonTextReaderTest.cs | 111 +++++++++++++++--- .../JsonValidatingReaderTests.cs | 14 +-- Src/Newtonsoft.Json.Tests/Linq/JArrayTests.cs | 2 +- .../Linq/JObjectTests.cs | 6 +- .../Linq/JTokenReaderTest.cs | 14 +-- Src/Newtonsoft.Json.Tests/Linq/JTokenTests.cs | 2 +- .../Linq/LinqToJsonTest.cs | 6 +- .../Serialization/DynamicTests.cs | 2 +- .../Serialization/JsonSerializerTest.cs | 14 +-- .../MetadataPropertyHandlingTests.cs | 6 +- .../MissingMemberHandlingTests.cs | 2 +- .../PreserveReferencesHandlingTests.cs | 6 +- .../SerializationErrorHandlingTests.cs | 8 +- .../Serialization/TraceWriterTests.cs | 52 ++++---- .../Serialization/TypeNameHandlingTests.cs | 2 +- Src/Newtonsoft.Json/JsonPosition.cs | 6 +- Src/Newtonsoft.Json/JsonTextReader.cs | 4 +- 18 files changed, 169 insertions(+), 94 deletions(-) diff --git a/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs b/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs index b1a04668..f9c3c0a5 100644 --- a/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs +++ b/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs @@ -427,7 +427,7 @@ namespace Newtonsoft.Json.Tests.Converters { JsonConvert.DeserializeXmlNode(json); }, - "JSON root object has multiple properties. The root object must have a single property in order to create a valid XML document. Consider specifing a DeserializeRootElementName. Path 'Email', line 3, position 14."); + "JSON root object has multiple properties. The root object must have a single property in order to create a valid XML document. Consider specifing a DeserializeRootElementName. Path 'Email', line 3, position 13."); } [Test] @@ -1554,7 +1554,7 @@ namespace Newtonsoft.Json.Tests.Converters ExceptionAssert.Throws( () => { JsonConvert.DeserializeXmlNode(json, "root"); }, - "Unexpected JsonToken: StartArray. Path '$id', line 2, position 11."); + "Unexpected JsonToken: StartArray. Path '$id', line 2, position 10."); } [Test] @@ -1682,7 +1682,7 @@ namespace Newtonsoft.Json.Tests.Converters ExceptionAssert.Throws( () => { DeserializeXmlNode(json); }, - "XmlNodeConverter cannot convert JSON with an empty property name to XML. Path '8452309520V2.', line 3, position 10."); + "XmlNodeConverter cannot convert JSON with an empty property name to XML. Path '8452309520V2.', line 3, position 9."); } [Test] diff --git a/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs b/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs index 85888b0f..9749c905 100644 --- a/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs +++ b/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs @@ -52,6 +52,82 @@ namespace Newtonsoft.Json.Tests [TestFixture] public class JsonTextReaderTest : TestFixtureBase { + [Test] + public void LineInfoAndNewLines() + { + string json = "{}"; + + JsonTextReader jsonTextReader = new JsonTextReader(new StringReader(json)); + + Assert.IsTrue(jsonTextReader.Read()); + Assert.AreEqual(JsonToken.StartObject, jsonTextReader.TokenType); + Assert.AreEqual(1, jsonTextReader.LineNumber); + Assert.AreEqual(1, jsonTextReader.LinePosition); + + Assert.IsTrue(jsonTextReader.Read()); + + Assert.AreEqual(JsonToken.EndObject, jsonTextReader.TokenType); + Assert.AreEqual(1, jsonTextReader.LineNumber); + Assert.AreEqual(2, jsonTextReader.LinePosition); + + json = "\n{\"a\":\"bc\"}"; + + jsonTextReader = new JsonTextReader(new StringReader(json)); + + Assert.IsTrue(jsonTextReader.Read()); + Assert.AreEqual(JsonToken.StartObject, jsonTextReader.TokenType); + Assert.AreEqual(2, jsonTextReader.LineNumber); + Assert.AreEqual(1, jsonTextReader.LinePosition); + + Assert.IsTrue(jsonTextReader.Read()); + Assert.AreEqual(JsonToken.PropertyName, jsonTextReader.TokenType); + Assert.AreEqual(2, jsonTextReader.LineNumber); + Assert.AreEqual(5, jsonTextReader.LinePosition); + + Assert.IsTrue(jsonTextReader.Read()); + Assert.AreEqual(JsonToken.String, jsonTextReader.TokenType); + Assert.AreEqual(2, jsonTextReader.LineNumber); + Assert.AreEqual(9, jsonTextReader.LinePosition); + + Assert.IsTrue(jsonTextReader.Read()); + Assert.AreEqual(JsonToken.EndObject, jsonTextReader.TokenType); + Assert.AreEqual(2, jsonTextReader.LineNumber); + Assert.AreEqual(10, jsonTextReader.LinePosition); + + json = "\n{\"a\":\n\"bc\",\"d\":true\n}"; + + jsonTextReader = new JsonTextReader(new StringReader(json)); + + Assert.IsTrue(jsonTextReader.Read()); + Assert.AreEqual(JsonToken.StartObject, jsonTextReader.TokenType); + Assert.AreEqual(2, jsonTextReader.LineNumber); + Assert.AreEqual(1, jsonTextReader.LinePosition); + + Assert.IsTrue(jsonTextReader.Read()); + Assert.AreEqual(JsonToken.PropertyName, jsonTextReader.TokenType); + Assert.AreEqual(2, jsonTextReader.LineNumber); + Assert.AreEqual(5, jsonTextReader.LinePosition); + + Assert.IsTrue(jsonTextReader.Read()); + Assert.AreEqual(JsonToken.String, jsonTextReader.TokenType); + Assert.AreEqual(3, jsonTextReader.LineNumber); + Assert.AreEqual(4, jsonTextReader.LinePosition); + + Assert.IsTrue(jsonTextReader.Read()); + Assert.AreEqual(JsonToken.PropertyName, jsonTextReader.TokenType); + Assert.AreEqual(3, jsonTextReader.LineNumber); + Assert.AreEqual(9, jsonTextReader.LinePosition); + + Assert.IsTrue(jsonTextReader.Read()); + Assert.AreEqual(JsonToken.Boolean, jsonTextReader.TokenType); + Assert.AreEqual(3, jsonTextReader.LineNumber); + Assert.AreEqual(13, jsonTextReader.LinePosition); + + Assert.IsTrue(jsonTextReader.Read()); + Assert.AreEqual(JsonToken.EndObject, jsonTextReader.TokenType); + Assert.AreEqual(4, jsonTextReader.LineNumber); + Assert.AreEqual(1, jsonTextReader.LinePosition); + } [Test] public void ReadCommentInsideArray() { @@ -192,7 +268,7 @@ third line", jsonTextReader.Value); Assert.IsTrue(jsonTextReader.Read()); Assert.AreEqual(JsonToken.PropertyName, jsonTextReader.TokenType); - ExceptionAssert.Throws(() => jsonTextReader.ReadAsInt32(), "JSON integer 333333333333333333333333333333333333333 is too large or small for an Int32. Path 'ChildId', line 2, position 53."); + ExceptionAssert.Throws(() => jsonTextReader.ReadAsInt32(), "JSON integer 333333333333333333333333333333333333333 is too large or small for an Int32. Path 'ChildId', line 2, position 52."); Assert.IsTrue(jsonTextReader.Read()); Assert.AreEqual(JsonToken.EndObject, jsonTextReader.TokenType); @@ -215,13 +291,13 @@ third line", jsonTextReader.Value); Assert.IsTrue(jsonTextReader.Read()); Assert.AreEqual(JsonToken.StartArray, jsonTextReader.TokenType); - ExceptionAssert.Throws(() => jsonTextReader.ReadAsInt32(), "JSON integer 333333333333333333333333333333333333333 is too large or small for an Int32. Path '[0]', line 2, position 42."); + ExceptionAssert.Throws(() => jsonTextReader.ReadAsInt32(), "JSON integer 333333333333333333333333333333333333333 is too large or small for an Int32. Path '[0]', line 2, position 41."); - ExceptionAssert.Throws(() => jsonTextReader.ReadAsInt32(), "Input string '3.3' is not a valid integer. Path '[1]', line 3, position 6."); + ExceptionAssert.Throws(() => jsonTextReader.ReadAsInt32(), "Input string '3.3' is not a valid integer. Path '[1]', line 3, position 5."); - ExceptionAssert.Throws(() => jsonTextReader.ReadAsInt32(), "Error reading integer. Unexpected token: Undefined. Path '[2]', line 4, position 3."); + ExceptionAssert.Throws(() => jsonTextReader.ReadAsInt32(), "Error reading integer. Unexpected token: Undefined. Path '[2]', line 4, position 2."); - ExceptionAssert.Throws(() => jsonTextReader.ReadAsInt32(), "Input string '0f' is not a valid integer. Path '[3]', line 5, position 5."); + ExceptionAssert.Throws(() => jsonTextReader.ReadAsInt32(), "Input string '0f' is not a valid integer. Path '[3]', line 5, position 4."); Assert.IsTrue(jsonTextReader.Read()); Assert.AreEqual(JsonToken.EndArray, jsonTextReader.TokenType); @@ -563,7 +639,7 @@ third line", jsonTextReader.Value); while (reader.Read()) { } - }, "Additional text encountered after finished reading JSON content: ,. Path '', line 5, position 2."); + }, "Additional text encountered after finished reading JSON content: ,. Path '', line 5, position 1."); } [Test] @@ -595,7 +671,7 @@ third line", jsonTextReader.Value); reader.Read(); Assert.AreEqual(5, reader.LineNumber); - ExceptionAssert.Throws(() => { reader.Read(); }, "Additional text encountered after finished reading JSON content: c. Path '', line 5, position 2."); + ExceptionAssert.Throws(() => { reader.Read(); }, "Additional text encountered after finished reading JSON content: c. Path '', line 5, position 1."); } [Test] @@ -662,48 +738,48 @@ third line", jsonTextReader.Value); Assert.AreEqual(jsonReader.TokenType, JsonToken.PropertyName); Assert.AreEqual(jsonReader.Value, "CPU"); Assert.AreEqual(2, jsonReader.LineNumber); - Assert.AreEqual(7, jsonReader.LinePosition); + Assert.AreEqual(6, jsonReader.LinePosition); jsonReader.Read(); Assert.AreEqual(JsonToken.String, jsonReader.TokenType); Assert.AreEqual("Intel", jsonReader.Value); Assert.AreEqual(2, jsonReader.LineNumber); - Assert.AreEqual(15, jsonReader.LinePosition); + Assert.AreEqual(14, jsonReader.LinePosition); jsonReader.Read(); Assert.AreEqual(jsonReader.TokenType, JsonToken.PropertyName); Assert.AreEqual(jsonReader.Value, "Drives"); Assert.AreEqual(3, jsonReader.LineNumber); - Assert.AreEqual(10, jsonReader.LinePosition); + Assert.AreEqual(9, jsonReader.LinePosition); jsonReader.Read(); Assert.AreEqual(jsonReader.TokenType, JsonToken.StartArray); Assert.AreEqual(3, jsonReader.LineNumber); - Assert.AreEqual(12, jsonReader.LinePosition); + Assert.AreEqual(11, jsonReader.LinePosition); jsonReader.Read(); Assert.AreEqual(jsonReader.TokenType, JsonToken.String); Assert.AreEqual(jsonReader.Value, "DVD read/writer"); Assert.AreEqual(jsonReader.QuoteChar, '\''); Assert.AreEqual(4, jsonReader.LineNumber); - Assert.AreEqual(22, jsonReader.LinePosition); + Assert.AreEqual(21, jsonReader.LinePosition); jsonReader.Read(); Assert.AreEqual(jsonReader.TokenType, JsonToken.String); Assert.AreEqual(jsonReader.Value, "500 gigabyte hard drive"); Assert.AreEqual(jsonReader.QuoteChar, '"'); Assert.AreEqual(5, jsonReader.LineNumber); - Assert.AreEqual(30, jsonReader.LinePosition); + Assert.AreEqual(29, jsonReader.LinePosition); jsonReader.Read(); Assert.AreEqual(jsonReader.TokenType, JsonToken.EndArray); Assert.AreEqual(6, jsonReader.LineNumber); - Assert.AreEqual(4, jsonReader.LinePosition); + Assert.AreEqual(3, jsonReader.LinePosition); jsonReader.Read(); Assert.AreEqual(jsonReader.TokenType, JsonToken.EndObject); Assert.AreEqual(7, jsonReader.LineNumber); - Assert.AreEqual(2, jsonReader.LinePosition); + Assert.AreEqual(1, jsonReader.LinePosition); Assert.IsFalse(jsonReader.Read()); } @@ -1744,7 +1820,7 @@ third line", jsonTextReader.Value); reader.Read(); Assert.AreEqual(JsonToken.Boolean, reader.TokenType); - ExceptionAssert.Throws(() => { reader.Read(); }, @"Invalid character after parsing property name. Expected ':' but got: "". Path 'A', line 3, position 9."); + ExceptionAssert.Throws(() => { reader.Read(); }, @"Invalid character after parsing property name. Expected ':' but got: "". Path 'A', line 3, position 8."); } [Test] @@ -3246,12 +3322,11 @@ null//comment { } }, - "Unexpected character encountered while parsing value: !. Path 'frameworks.dnxcore50.dependencies.['System.Xml.ReaderWriter'].source', line 6, position 21."); + "Unexpected character encountered while parsing value: !. Path 'frameworks.dnxcore50.dependencies['System.Xml.ReaderWriter'].source', line 6, position 20."); } #if !DNXCORE50 [Test] - [Ignore("Fix this next major version")] public void LinePositionOnNewLine() { string json1 = "{'a':'bc'}"; diff --git a/Src/Newtonsoft.Json.Tests/JsonValidatingReaderTests.cs b/Src/Newtonsoft.Json.Tests/JsonValidatingReaderTests.cs index 01e3bcb5..79be8db4 100644 --- a/Src/Newtonsoft.Json.Tests/JsonValidatingReaderTests.cs +++ b/Src/Newtonsoft.Json.Tests/JsonValidatingReaderTests.cs @@ -1323,11 +1323,11 @@ namespace Newtonsoft.Json.Tests Assert.IsTrue(reader.Read()); Assert.AreEqual(JsonToken.Integer, reader.TokenType); - Assert.AreEqual("Invalid type. Expected String but got Integer. Line 4, position 10.", validationEventArgs.Message); + Assert.AreEqual("Invalid type. Expected String but got Integer. Line 4, position 9.", validationEventArgs.Message); Assert.IsTrue(reader.Read()); Assert.AreEqual(JsonToken.PropertyName, reader.TokenType); - Assert.AreEqual("Property 'hey' has not been defined and the schema does not allow additional properties. Line 5, position 9.", validationEventArgs.Message); + Assert.AreEqual("Property 'hey' has not been defined and the schema does not allow additional properties. Line 5, position 8.", validationEventArgs.Message); Assert.IsTrue(reader.Read()); Assert.AreEqual(JsonToken.String, reader.TokenType); @@ -1432,7 +1432,7 @@ namespace Newtonsoft.Json.Tests Assert.AreEqual(JsonToken.String, reader.TokenType); Assert.AreEqual("secasecasecasecaseca", reader.Value.ToString()); Assert.AreEqual(1, errors.Count); - Assert.AreEqual("secondproperty - String 'secasecasecasecaseca' exceeds maximum length of 10. Line 3, position 42.", errors[0]); + Assert.AreEqual("secondproperty - String 'secasecasecasecaseca' exceeds maximum length of 10. Line 3, position 41.", errors[0]); Assert.IsTrue(reader.Read()); Assert.AreEqual(JsonToken.PropertyName, reader.TokenType); @@ -1452,9 +1452,9 @@ namespace Newtonsoft.Json.Tests Assert.AreEqual(JsonToken.String, reader.TokenType); Assert.AreEqual("aaa", reader.Value.ToString()); Assert.AreEqual(4, errors.Count); - Assert.AreEqual("thirdproperty.thirdproperty_firstproperty - String 'aaa' is less than minimum length of 7. Line 5, position 40.", errors[1]); - Assert.AreEqual("thirdproperty.thirdproperty_firstproperty - String 'aaa' does not match regex pattern 'hi'. Line 5, position 40.", errors[2]); - Assert.AreEqual("thirdproperty.thirdproperty_firstproperty - String 'aaa' does not match regex pattern 'hi2u'. Line 5, position 40.", errors[3]); + Assert.AreEqual("thirdproperty.thirdproperty_firstproperty - String 'aaa' is less than minimum length of 7. Line 5, position 39.", errors[1]); + Assert.AreEqual("thirdproperty.thirdproperty_firstproperty - String 'aaa' does not match regex pattern 'hi'. Line 5, position 39.", errors[2]); + Assert.AreEqual("thirdproperty.thirdproperty_firstproperty - String 'aaa' does not match regex pattern 'hi2u'. Line 5, position 39.", errors[3]); Assert.IsTrue(reader.Read()); Assert.AreEqual(JsonToken.PropertyName, reader.TokenType); @@ -1465,7 +1465,7 @@ namespace Newtonsoft.Json.Tests Assert.AreEqual(JsonToken.String, reader.TokenType); Assert.AreEqual("three", reader.Value.ToString()); Assert.AreEqual(5, errors.Count); - Assert.AreEqual("thirdproperty.additional - String 'three' is less than minimum length of 6. Line 6, position 25.", errors[4]); + Assert.AreEqual("thirdproperty.additional - String 'three' is less than minimum length of 6. Line 6, position 24.", errors[4]); Assert.IsTrue(reader.Read()); Assert.AreEqual(JsonToken.EndObject, reader.TokenType); diff --git a/Src/Newtonsoft.Json.Tests/Linq/JArrayTests.cs b/Src/Newtonsoft.Json.Tests/Linq/JArrayTests.cs index e0e9a217..59b65bf0 100644 --- a/Src/Newtonsoft.Json.Tests/Linq/JArrayTests.cs +++ b/Src/Newtonsoft.Json.Tests/Linq/JArrayTests.cs @@ -526,7 +526,7 @@ Parameter name: index"); ""Large"" ], 987987"; - ExceptionAssert.Throws(() => { JArray.Parse(json); }, "Additional text encountered after finished reading JSON content: ,. Path '', line 5, position 2."); + ExceptionAssert.Throws(() => { JArray.Parse(json); }, "Additional text encountered after finished reading JSON content: ,. Path '', line 5, position 1."); } [Test] diff --git a/Src/Newtonsoft.Json.Tests/Linq/JObjectTests.cs b/Src/Newtonsoft.Json.Tests/Linq/JObjectTests.cs index d39e5dd7..fc918d7e 100644 --- a/Src/Newtonsoft.Json.Tests/Linq/JObjectTests.cs +++ b/Src/Newtonsoft.Json.Tests/Linq/JObjectTests.cs @@ -499,7 +499,7 @@ Parameter name: arrayIndex"); ExceptionAssert.Throws(() => { JObject.Parse(@"{ ""name"": ""James"", ]!#$THIS IS: BAD JSON![{}}}}] - }"); }, "Invalid property identifier character: ]. Path 'name', line 3, position 5."); + }"); }, "Invalid property identifier character: ]. Path 'name', line 3, position 4."); } [Test] @@ -1693,7 +1693,7 @@ Parameter name: arrayIndex"); reader.Read(); JToken.ReadFrom(reader); - }, "Unexpected end of content while loading JObject. Path 'short.error.code', line 6, position 15."); + }, "Unexpected end of content while loading JObject. Path 'short.error.code', line 6, position 14."); } #if !(NETFX_CORE || PORTABLE || DNXCORE50 || PORTABLE40) @@ -1788,7 +1788,7 @@ Parameter name: arrayIndex"); }, 987987"; JObject o = JObject.Parse(json); - }, "Additional text encountered after finished reading JSON content: ,. Path '', line 10, position 2."); + }, "Additional text encountered after finished reading JSON content: ,. Path '', line 10, position 1."); } [Test] diff --git a/Src/Newtonsoft.Json.Tests/Linq/JTokenReaderTest.cs b/Src/Newtonsoft.Json.Tests/Linq/JTokenReaderTest.cs index feeeb572..484b59c0 100644 --- a/Src/Newtonsoft.Json.Tests/Linq/JTokenReaderTest.cs +++ b/Src/Newtonsoft.Json.Tests/Linq/JTokenReaderTest.cs @@ -231,7 +231,7 @@ namespace Newtonsoft.Json.Tests.Linq Assert.AreEqual(jsonReader.TokenType, JsonToken.PropertyName); Assert.AreEqual(jsonReader.Value, "CPU"); Assert.AreEqual(2, lineInfo.LineNumber); - Assert.AreEqual(7, lineInfo.LinePosition); + Assert.AreEqual(6, lineInfo.LinePosition); Assert.AreEqual(true, lineInfo.HasLineInfo()); Assert.AreEqual(o.Property("CPU"), jsonReader.CurrentToken); @@ -239,7 +239,7 @@ namespace Newtonsoft.Json.Tests.Linq Assert.AreEqual(jsonReader.TokenType, JsonToken.String); Assert.AreEqual(jsonReader.Value, "Intel"); Assert.AreEqual(2, lineInfo.LineNumber); - Assert.AreEqual(15, lineInfo.LinePosition); + Assert.AreEqual(14, lineInfo.LinePosition); Assert.AreEqual(true, lineInfo.HasLineInfo()); Assert.AreEqual(o.Property("CPU").Value, jsonReader.CurrentToken); @@ -247,14 +247,14 @@ namespace Newtonsoft.Json.Tests.Linq Assert.AreEqual(jsonReader.TokenType, JsonToken.PropertyName); Assert.AreEqual(jsonReader.Value, "Drives"); Assert.AreEqual(3, lineInfo.LineNumber); - Assert.AreEqual(10, lineInfo.LinePosition); + Assert.AreEqual(9, lineInfo.LinePosition); Assert.AreEqual(true, lineInfo.HasLineInfo()); Assert.AreEqual(o.Property("Drives"), jsonReader.CurrentToken); jsonReader.Read(); Assert.AreEqual(jsonReader.TokenType, JsonToken.StartArray); Assert.AreEqual(3, lineInfo.LineNumber); - Assert.AreEqual(12, lineInfo.LinePosition); + Assert.AreEqual(11, lineInfo.LinePosition); Assert.AreEqual(true, lineInfo.HasLineInfo()); Assert.AreEqual(o.Property("Drives").Value, jsonReader.CurrentToken); @@ -262,7 +262,7 @@ namespace Newtonsoft.Json.Tests.Linq Assert.AreEqual(jsonReader.TokenType, JsonToken.String); Assert.AreEqual(jsonReader.Value, "DVD read/writer"); Assert.AreEqual(4, lineInfo.LineNumber); - Assert.AreEqual(22, lineInfo.LinePosition); + Assert.AreEqual(21, lineInfo.LinePosition); Assert.AreEqual(true, lineInfo.HasLineInfo()); Assert.AreEqual(o["Drives"][0], jsonReader.CurrentToken); @@ -270,14 +270,14 @@ namespace Newtonsoft.Json.Tests.Linq Assert.AreEqual(jsonReader.TokenType, JsonToken.String); Assert.AreEqual(jsonReader.Value, "500 gigabyte hard drive"); Assert.AreEqual(5, lineInfo.LineNumber); - Assert.AreEqual(30, lineInfo.LinePosition); + Assert.AreEqual(29, lineInfo.LinePosition); Assert.AreEqual(true, lineInfo.HasLineInfo()); Assert.AreEqual(o["Drives"][1], jsonReader.CurrentToken); jsonReader.Read(); Assert.AreEqual(jsonReader.TokenType, JsonToken.EndArray); Assert.AreEqual(3, lineInfo.LineNumber); - Assert.AreEqual(12, lineInfo.LinePosition); + Assert.AreEqual(11, lineInfo.LinePosition); Assert.AreEqual(true, lineInfo.HasLineInfo()); Assert.AreEqual(o["Drives"], jsonReader.CurrentToken); diff --git a/Src/Newtonsoft.Json.Tests/Linq/JTokenTests.cs b/Src/Newtonsoft.Json.Tests/Linq/JTokenTests.cs index ddcc44b2..c7f70af0 100644 --- a/Src/Newtonsoft.Json.Tests/Linq/JTokenTests.cs +++ b/Src/Newtonsoft.Json.Tests/Linq/JTokenTests.cs @@ -1200,7 +1200,7 @@ namespace Newtonsoft.Json.Tests.Linq ],"; JToken.Parse(json); - }, "Additional text encountered after finished reading JSON content: ,. Path '', line 5, position 2."); + }, "Additional text encountered after finished reading JSON content: ,. Path '', line 5, position 1."); } [Test] diff --git a/Src/Newtonsoft.Json.Tests/Linq/LinqToJsonTest.cs b/Src/Newtonsoft.Json.Tests/Linq/LinqToJsonTest.cs index 7372da0c..2817d6d1 100644 --- a/Src/Newtonsoft.Json.Tests/Linq/LinqToJsonTest.cs +++ b/Src/Newtonsoft.Json.Tests/Linq/LinqToJsonTest.cs @@ -197,7 +197,7 @@ namespace Newtonsoft.Json.Tests.Linq IJsonLineInfo lineInfo = v; Assert.AreEqual(true, lineInfo.HasLineInfo()); Assert.AreEqual(3, lineInfo.LineNumber); - Assert.AreEqual(1, lineInfo.LinePosition); + Assert.AreEqual(0, lineInfo.LinePosition); } [Test] @@ -219,7 +219,7 @@ undefined IJsonLineInfo lineInfo = v; Assert.AreEqual(true, lineInfo.HasLineInfo()); Assert.AreEqual(2, lineInfo.LineNumber); - Assert.AreEqual(10, lineInfo.LinePosition); + Assert.AreEqual(9, lineInfo.LinePosition); } [Test] @@ -271,7 +271,7 @@ undefined JToken v1 = o["frameworks"]["dnxcore50"]["dependencies"]["System.Xml.ReaderWriter"]["source"]; - Assert.AreEqual("frameworks.dnxcore50.dependencies.['System.Xml.ReaderWriter'].source", v1.Path); + Assert.AreEqual("frameworks.dnxcore50.dependencies['System.Xml.ReaderWriter'].source", v1.Path); JToken v2 = o.SelectToken(v1.Path); diff --git a/Src/Newtonsoft.Json.Tests/Serialization/DynamicTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/DynamicTests.cs index e3444085..f8a19b7c 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/DynamicTests.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/DynamicTests.cs @@ -165,7 +165,7 @@ namespace Newtonsoft.Json.Tests.Serialization }"; JsonConvert.DeserializeObject(json, settings); - }, "Unable to find a default constructor to use for type System.Dynamic.DynamicObject. Path 'contributors', line 2, position 18."); + }, "Unable to find a default constructor to use for type System.Dynamic.DynamicObject. Path 'contributors', line 2, position 17."); } public class DictionaryDynamicObject : DynamicObject diff --git a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs index b376f9bd..371dda65 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs @@ -5175,7 +5175,7 @@ Path '', line 1, position 1."); var json = JsonConvert.SerializeObject(child, Formatting.Indented); - ExceptionAssert.Throws(() => { JsonConvert.DeserializeObject>(json); }, "Additional content found in JSON reference object. A JSON reference object should only have a $ref property. Path 'Father.$id', line 6, position 11."); + ExceptionAssert.Throws(() => { JsonConvert.DeserializeObject>(json); }, "Additional content found in JSON reference object. A JSON reference object should only have a $ref property. Path 'Father.$id', line 6, position 10."); } [Test] @@ -5196,7 +5196,7 @@ Path '', line 1, position 1."); var json = JsonConvert.SerializeObject(child, Formatting.Indented); JsonConvert.DeserializeObject>(json); - }, "JSON reference $ref property must have a string or null value. Path 'Father.$ref', line 5, position 14."); + }, "JSON reference $ref property must have a string or null value. Path 'Father.$ref', line 5, position 13."); } [Test] @@ -5417,7 +5417,7 @@ Path '', line 1, position 1."); } else { - ExceptionAssert.Throws(() => { JsonConvert.DeserializeObject(json); }, "Cannot create and populate list type " + classRef + ". Path 'StringDictionaryProperty', line 2, position 32."); + ExceptionAssert.Throws(() => { JsonConvert.DeserializeObject(json); }, "Cannot create and populate list type " + classRef + ". Path 'StringDictionaryProperty', line 2, position 31."); } } #endif @@ -6774,7 +6774,7 @@ Path '', line 1, position 1."); null ]"; - ExceptionAssert.Throws(() => { List numbers = JsonConvert.DeserializeObject>(json); }, "Error converting value {null} to type 'System.Int32'. Path '[3]', line 5, position 7."); + ExceptionAssert.Throws(() => { List numbers = JsonConvert.DeserializeObject>(json); }, "Error converting value {null} to type 'System.Int32'. Path '[3]', line 5, position 6."); } #if !(PORTABLE || NETFX_CORE) @@ -6813,7 +6813,7 @@ Path '', line 1, position 1."); ""NullableInteger2"": null }"; - ExceptionAssert.Throws(() => JsonConvert.DeserializeObject(json), "Error converting value 1 to type 'Newtonsoft.Json.Tests.ConvertibleInt'. Path 'Integer', line 2, position 15."); + ExceptionAssert.Throws(() => JsonConvert.DeserializeObject(json), "Error converting value 1 to type 'Newtonsoft.Json.Tests.ConvertibleInt'. Path 'Integer', line 2, position 14."); } #endif @@ -6850,7 +6850,7 @@ Path '', line 1, position 1."); }"; JsonConvert.DeserializeObject(json); - }, "Error reading integer. Unexpected token: Boolean. Path 'PreProperty', line 2, position 22."); + }, "Error reading integer. Unexpected token: Boolean. Path 'PreProperty', line 2, position 21."); } [Test] @@ -9159,7 +9159,7 @@ Path '', line 1, position 1."); new AttachmentReadConverter(), new EncodingReadConverter()); }, - "Cannot populate list type System.Net.Mime.HeaderCollection. Path 'Headers', line 26, position 15."); + "Cannot populate list type System.Net.Mime.HeaderCollection. Path 'Headers', line 26, position 14."); } public class MailAddressReadConverter : JsonConverter diff --git a/Src/Newtonsoft.Json.Tests/Serialization/MetadataPropertyHandlingTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/MetadataPropertyHandlingTests.cs index 2c2c5a22..f8a55263 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/MetadataPropertyHandlingTests.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/MetadataPropertyHandlingTests.cs @@ -110,7 +110,7 @@ namespace Newtonsoft.Json.Tests.Serialization PreserveReferencesHandling = PreserveReferencesHandling.All, MetadataPropertyHandling = MetadataPropertyHandling.ReadAhead }); - }, @"Cannot preserve reference to array or readonly list, or list created from a non-default constructor: System.String[][]. Path '$values', line 3, position 15."); + }, @"Cannot preserve reference to array or readonly list, or list created from a non-default constructor: System.String[][]. Path '$values', line 3, position 14."); } #if !NETFX_CORE @@ -241,7 +241,7 @@ namespace Newtonsoft.Json.Tests.Serialization TypeNameHandling = TypeNameHandling.Objects, MetadataPropertyHandling = MetadataPropertyHandling.ReadAhead }); - }, "Type specified in JSON 'Newtonsoft.Json.Tests.TestObjects.Employee' was not resolved. Path '$type', line 3, position 56."); + }, "Type specified in JSON 'Newtonsoft.Json.Tests.TestObjects.Employee' was not resolved. Path '$type', line 3, position 55."); } [Test] @@ -561,7 +561,7 @@ namespace Newtonsoft.Json.Tests.Serialization }); }, @"Cannot deserialize the current JSON object (e.g. {""name"":""value""}) into type 'System.Double' because the type requires a JSON primitive value (e.g. string, number, boolean, null) to deserialize correctly. To fix this error either change the JSON to a JSON primitive value (e.g. string, number, boolean, null) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object. -Path 'Payload.$type', line 3, position 13."); +Path 'Payload.$type', line 3, position 12."); } [Test] diff --git a/Src/Newtonsoft.Json.Tests/Serialization/MissingMemberHandlingTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/MissingMemberHandlingTests.cs index 9329f19b..76028912 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/MissingMemberHandlingTests.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/MissingMemberHandlingTests.cs @@ -66,7 +66,7 @@ namespace Newtonsoft.Json.Tests.Serialization // ] //} - ExceptionAssert.Throws(() => { ProductShort deserializedProductShort = (ProductShort)JsonConvert.DeserializeObject(output, typeof(ProductShort), new JsonSerializerSettings { MissingMemberHandling = MissingMemberHandling.Error }); }, @"Could not find member 'Price' on object of type 'ProductShort'. Path 'Price', line 4, position 11."); + ExceptionAssert.Throws(() => { ProductShort deserializedProductShort = (ProductShort)JsonConvert.DeserializeObject(output, typeof(ProductShort), new JsonSerializerSettings { MissingMemberHandling = MissingMemberHandling.Error }); }, @"Could not find member 'Price' on object of type 'ProductShort'. Path 'Price', line 4, position 10."); } [Test] diff --git a/Src/Newtonsoft.Json.Tests/Serialization/PreserveReferencesHandlingTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/PreserveReferencesHandlingTests.cs index 1c469eb1..acfb92ac 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/PreserveReferencesHandlingTests.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/PreserveReferencesHandlingTests.cs @@ -429,7 +429,7 @@ namespace Newtonsoft.Json.Tests.Serialization { JsonConvert.DeserializeObject(json, new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.All }); - }, @"Cannot preserve reference to array or readonly list, or list created from a non-default constructor: System.String[][]. Path '$values', line 3, position 15."); + }, @"Cannot preserve reference to array or readonly list, or list created from a non-default constructor: System.String[][]. Path '$values', line 3, position 14."); } public class CircularDictionary : Dictionary @@ -479,7 +479,7 @@ namespace Newtonsoft.Json.Tests.Serialization PreserveReferencesHandling = PreserveReferencesHandling.All, MetadataPropertyHandling = MetadataPropertyHandling.Default }); - }, @"Unexpected end when deserializing object. Path '$id', line 2, position 9."); + }, @"Unexpected end when deserializing object. Path '$id', line 2, position 8."); } public class CircularReferenceClassConverter : JsonConverter @@ -1244,7 +1244,7 @@ namespace Newtonsoft.Json.Tests.Serialization ExceptionAssert.Throws(() => JsonConvert.DeserializeObject(json, new JsonSerializerSettings { MetadataPropertyHandling = MetadataPropertyHandling.Default - }), "Error reading object reference '1'. Path 'Data.Prop2.MyProperty', line 9, position 20."); + }), "Error reading object reference '1'. Path 'Data.Prop2.MyProperty', line 9, position 19."); } } diff --git a/Src/Newtonsoft.Json.Tests/Serialization/SerializationErrorHandlingTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/SerializationErrorHandlingTests.cs index 53611cea..30082d49 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/SerializationErrorHandlingTests.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/SerializationErrorHandlingTests.cs @@ -323,8 +323,8 @@ namespace Newtonsoft.Json.Tests.Serialization Assert.IsTrue(possibleErrs.Any (m => m == errors[0]), "Expected One of: " + string.Join (Environment.NewLine, possibleErrs) + Environment.NewLine + "But was: " + errors[0]); - Assert.AreEqual("[2] - 2 - Unexpected token parsing date. Expected String, got StartArray. Path '[2]', line 4, position 10.", errors[1]); - Assert.AreEqual("[4] - 4 - Cannot convert null value to System.DateTime. Path '[4]', line 8, position 13.", errors[2]); + Assert.AreEqual("[2] - 2 - Unexpected token parsing date. Expected String, got StartArray. Path '[2]', line 4, position 9.", errors[1]); + Assert.AreEqual("[4] - 4 - Cannot convert null value to System.DateTime. Path '[4]', line 8, position 12.", errors[2]); } [Test] @@ -662,8 +662,8 @@ namespace Newtonsoft.Json.Tests.Serialization Assert.AreEqual(123, d.ChildObject.Integer); Assert.AreEqual(2, errors.Count); - Assert.AreEqual(@"Unexpected end when deserializing object. Path 'ChildObject.Integer', line 6, position 19.", errors[0]); - Assert.AreEqual(@"Unexpected end when deserializing object. Path 'ChildObject.Integer', line 6, position 19.", errors[1]); + Assert.AreEqual(@"Unexpected end when deserializing object. Path 'ChildObject.Integer', line 6, position 18.", errors[0]); + Assert.AreEqual(@"Unexpected end when deserializing object. Path 'ChildObject.Integer', line 6, position 18.", errors[1]); } #endif diff --git a/Src/Newtonsoft.Json.Tests/Serialization/TraceWriterTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/TraceWriterTests.cs index f1a64b8a..6a631baf 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/TraceWriterTests.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/TraceWriterTests.cs @@ -217,7 +217,7 @@ Newtonsoft.Json Error: 0 : Error! MemoryTraceWriter memoryTraceWriter = (MemoryTraceWriter)traceWriter; string output = memoryTraceWriter.ToString(); - Assert.AreEqual(1059, output.Length); + Assert.AreEqual(1058, output.Length); Assert.AreEqual(7, memoryTraceWriter.GetTraceMessages().Count()); json = StringAssert.Normalize(json); @@ -330,15 +330,15 @@ Newtonsoft.Json Error: 0 : Error! Assert.AreEqual(2, o2.Version.Minor); Assert.AreEqual(3, o2.StringDictionary.Count); - Assert.AreEqual("Started deserializing Newtonsoft.Json.Tests.Serialization.TraceTestObject. Path 'IntList', line 2, position 13.", traceWriter.TraceRecords[0].Message); - Assert.AreEqual("Started deserializing System.Collections.Generic.IList`1[System.Int32]. Path 'IntList', line 2, position 15.", traceWriter.TraceRecords[1].Message); + Assert.AreEqual("Started deserializing Newtonsoft.Json.Tests.Serialization.TraceTestObject. Path 'IntList', line 2, position 12.", traceWriter.TraceRecords[0].Message); + Assert.AreEqual("Started deserializing System.Collections.Generic.IList`1[System.Int32]. Path 'IntList', line 2, position 14.", traceWriter.TraceRecords[1].Message); Assert.IsTrue(traceWriter.TraceRecords[2].Message.StartsWith("Finished deserializing System.Collections.Generic.IList`1[System.Int32]. Path 'IntList'")); - Assert.AreEqual("Started deserializing System.String[]. Path 'StringArray', line 6, position 19.", traceWriter.TraceRecords[3].Message); + Assert.AreEqual("Started deserializing System.String[]. Path 'StringArray', line 6, position 18.", traceWriter.TraceRecords[3].Message); Assert.IsTrue(traceWriter.TraceRecords[4].Message.StartsWith("Finished deserializing System.String[]. Path 'StringArray'")); - Assert.AreEqual("Deserializing System.Version using creator with parameters: Major, Minor, Build, Revision. Path 'Version.Major', line 11, position 13.", traceWriter.TraceRecords[5].Message); + Assert.AreEqual("Deserializing System.Version using creator with parameters: Major, Minor, Build, Revision. Path 'Version.Major', line 11, position 12.", traceWriter.TraceRecords[5].Message); Assert.IsTrue(traceWriter.TraceRecords[6].Message.StartsWith("Started deserializing System.Version. Path 'Version'")); Assert.IsTrue(traceWriter.TraceRecords[7].Message.StartsWith("Finished deserializing System.Version. Path 'Version'")); - Assert.AreEqual("Started deserializing System.Collections.Generic.IDictionary`2[System.String,System.String]. Path 'StringDictionary.1', line 19, position 9.", traceWriter.TraceRecords[8].Message); + Assert.AreEqual("Started deserializing System.Collections.Generic.IDictionary`2[System.String,System.String]. Path 'StringDictionary.1', line 19, position 8.", traceWriter.TraceRecords[8].Message); Assert.IsTrue(traceWriter.TraceRecords[9].Message.StartsWith("Finished deserializing System.Collections.Generic.IDictionary`2[System.String,System.String]. Path 'StringDictionary'")); Assert.IsTrue(traceWriter.TraceRecords[10].Message.StartsWith("Finished deserializing Newtonsoft.Json.Tests.Serialization.TraceTestObject. Path ''")); @@ -391,15 +391,15 @@ Newtonsoft.Json Error: 0 : Error! Assert.AreEqual(2, o2.Version.Minor); Assert.AreEqual(3, o2.StringDictionary.Count); - Assert.AreEqual("Started deserializing Newtonsoft.Json.Tests.Serialization.TraceTestObject. Path 'IntList', line 2, position 13.", traceWriter.TraceRecords[0].Message); - Assert.AreEqual("Started deserializing System.Collections.Generic.IList`1[System.Int32]. Path 'IntList', line 2, position 15.", traceWriter.TraceRecords[1].Message); + Assert.AreEqual("Started deserializing Newtonsoft.Json.Tests.Serialization.TraceTestObject. Path 'IntList', line 2, position 12.", traceWriter.TraceRecords[0].Message); + Assert.AreEqual("Started deserializing System.Collections.Generic.IList`1[System.Int32]. Path 'IntList', line 2, position 14.", traceWriter.TraceRecords[1].Message); Assert.IsTrue(traceWriter.TraceRecords[2].Message.StartsWith("Finished deserializing System.Collections.Generic.IList`1[System.Int32]. Path 'IntList'")); - Assert.AreEqual("Started deserializing System.String[]. Path 'StringArray', line 6, position 19.", traceWriter.TraceRecords[3].Message); + Assert.AreEqual("Started deserializing System.String[]. Path 'StringArray', line 6, position 18.", traceWriter.TraceRecords[3].Message); Assert.IsTrue(traceWriter.TraceRecords[4].Message.StartsWith("Finished deserializing System.String[]. Path 'StringArray'")); - Assert.AreEqual("Deserializing System.Version using creator with parameters: Major, Minor, Build, Revision. Path 'Version.Major', line 11, position 13.", traceWriter.TraceRecords[5].Message); + Assert.AreEqual("Deserializing System.Version using creator with parameters: Major, Minor, Build, Revision. Path 'Version.Major', line 11, position 12.", traceWriter.TraceRecords[5].Message); Assert.IsTrue(traceWriter.TraceRecords[6].Message.StartsWith("Started deserializing System.Version. Path 'Version'")); Assert.IsTrue(traceWriter.TraceRecords[7].Message.StartsWith("Finished deserializing System.Version. Path 'Version'")); - Assert.AreEqual("Started deserializing System.Collections.Generic.IDictionary`2[System.String,System.String]. Path 'StringDictionary.1', line 19, position 9.", traceWriter.TraceRecords[8].Message); + Assert.AreEqual("Started deserializing System.Collections.Generic.IDictionary`2[System.String,System.String]. Path 'StringDictionary.1', line 19, position 8.", traceWriter.TraceRecords[8].Message); Assert.IsTrue(traceWriter.TraceRecords[9].Message.StartsWith("Finished deserializing System.Collections.Generic.IDictionary`2[System.String,System.String]. Path 'StringDictionary'")); Assert.IsTrue(traceWriter.TraceRecords[10].Message.StartsWith("Finished deserializing Newtonsoft.Json.Tests.Serialization.TraceTestObject. Path ''")); @@ -520,8 +520,8 @@ Newtonsoft.Json Error: 0 : Error! TraceWriter = traceWriter }); - Assert.IsTrue(traceWriter.TraceRecords.Any(r => r.Message == "Read object reference Id '1' for Newtonsoft.Json.Tests.Serialization.PreserveReferencesHandlingTests+CircularDictionary. Path 'other', line 3, position 11.")); - Assert.IsTrue(traceWriter.TraceRecords.Any(r => r.Message == "Read object reference Id '2' for Newtonsoft.Json.Tests.Serialization.PreserveReferencesHandlingTests+CircularDictionary. Path 'other.blah', line 5, position 12.")); + Assert.IsTrue(traceWriter.TraceRecords.Any(r => r.Message == "Read object reference Id '1' for Newtonsoft.Json.Tests.Serialization.PreserveReferencesHandlingTests+CircularDictionary. Path 'other', line 3, position 10.")); + Assert.IsTrue(traceWriter.TraceRecords.Any(r => r.Message == "Read object reference Id '2' for Newtonsoft.Json.Tests.Serialization.PreserveReferencesHandlingTests+CircularDictionary. Path 'other.blah', line 5, position 11.")); Assert.IsTrue(traceWriter.TraceRecords.Any(r => r.Message.StartsWith("Resolved object reference '1' to Newtonsoft.Json.Tests.Serialization.PreserveReferencesHandlingTests+CircularDictionary. Path 'self'"))); } @@ -640,13 +640,13 @@ Newtonsoft.Json Error: 0 : Error! TraceWriter = traceWriter }); - Assert.AreEqual("Resolved type 'System.Collections.Generic.List`1[[System.Object, mscorlib]], mscorlib' to System.Collections.Generic.List`1[System.Object]. Path '$type', line 2, position 84.", traceWriter.TraceRecords[0].Message); - Assert.AreEqual("Started deserializing System.Collections.Generic.List`1[System.Object]. Path '$values', line 3, position 15.", traceWriter.TraceRecords[1].Message); - Assert.AreEqual("Resolved type 'System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.String, mscorlib]], mscorlib' to System.Collections.Generic.Dictionary`2[System.String,System.String]. Path '$values[0].$type', line 5, position 120.", traceWriter.TraceRecords[2].Message); - Assert.AreEqual("Started deserializing System.Collections.Generic.Dictionary`2[System.String,System.String]. Path '$values[0].key!', line 6, position 14.", traceWriter.TraceRecords[3].Message); + Assert.AreEqual("Resolved type 'System.Collections.Generic.List`1[[System.Object, mscorlib]], mscorlib' to System.Collections.Generic.List`1[System.Object]. Path '$type', line 2, position 83.", traceWriter.TraceRecords[0].Message); + Assert.AreEqual("Started deserializing System.Collections.Generic.List`1[System.Object]. Path '$values', line 3, position 14.", traceWriter.TraceRecords[1].Message); + Assert.AreEqual("Resolved type 'System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.String, mscorlib]], mscorlib' to System.Collections.Generic.Dictionary`2[System.String,System.String]. Path '$values[0].$type', line 5, position 119.", traceWriter.TraceRecords[2].Message); + Assert.AreEqual("Started deserializing System.Collections.Generic.Dictionary`2[System.String,System.String]. Path '$values[0].key!', line 6, position 13.", traceWriter.TraceRecords[3].Message); Assert.IsTrue(traceWriter.TraceRecords[4].Message.StartsWith("Finished deserializing System.Collections.Generic.Dictionary`2[System.String,System.String]. Path '$values[0]'")); - Assert.AreEqual("Resolved type 'System.Version, mscorlib' to System.Version. Path '$values[1].$type', line 9, position 42.", traceWriter.TraceRecords[5].Message); - Assert.AreEqual("Deserializing System.Version using creator with parameters: Major, Minor, Build, Revision. Path '$values[1].Major', line 10, position 15.", traceWriter.TraceRecords[6].Message); + Assert.AreEqual("Resolved type 'System.Version, mscorlib' to System.Version. Path '$values[1].$type', line 9, position 41.", traceWriter.TraceRecords[5].Message); + Assert.AreEqual("Deserializing System.Version using creator with parameters: Major, Minor, Build, Revision. Path '$values[1].Major', line 10, position 14.", traceWriter.TraceRecords[6].Message); Assert.IsTrue(traceWriter.TraceRecords[7].Message.StartsWith("Started deserializing System.Version. Path '$values[1]'")); Assert.IsTrue(traceWriter.TraceRecords[8].Message.StartsWith("Finished deserializing System.Version. Path '$values[1]'")); Assert.IsTrue(traceWriter.TraceRecords[9].Message.StartsWith("Finished deserializing System.Collections.Generic.List`1[System.Object]. Path '$values'")); @@ -721,8 +721,8 @@ Newtonsoft.Json Error: 0 : Error! TraceWriter = traceWriter }); - Assert.AreEqual("Deserializing System.Version using creator with parameters: Major, Minor, Build, Revision. Path 'Major', line 2, position 11.", traceWriter.TraceRecords[0].Message); - Assert.AreEqual("Could not find member 'MissingMemberProperty' on System.Version. Path 'MissingMemberProperty', line 8, position 32.", traceWriter.TraceRecords[1].Message); + Assert.AreEqual("Deserializing System.Version using creator with parameters: Major, Minor, Build, Revision. Path 'Major', line 2, position 10.", traceWriter.TraceRecords[0].Message); + Assert.AreEqual("Could not find member 'MissingMemberProperty' on System.Version. Path 'MissingMemberProperty', line 8, position 31.", traceWriter.TraceRecords[1].Message); Assert.IsTrue(traceWriter.TraceRecords[2].Message.StartsWith("Started deserializing System.Version. Path ''")); Assert.IsTrue(traceWriter.TraceRecords[3].Message.StartsWith("Finished deserializing System.Version. Path ''")); } @@ -812,7 +812,7 @@ Newtonsoft.Json Error: 0 : Error! SpecifiedTestClass deserialized = JsonConvert.DeserializeObject(json, new JsonSerializerSettings { TraceWriter = traceWriter }); - Assert.AreEqual("Started deserializing Newtonsoft.Json.Tests.Serialization.SpecifiedTestClass. Path 'Age', line 2, position 9.", traceWriter.TraceRecords[0].Message); + Assert.AreEqual("Started deserializing Newtonsoft.Json.Tests.Serialization.SpecifiedTestClass. Path 'Age', line 2, position 8.", traceWriter.TraceRecords[0].Message); Assert.IsTrue(traceWriter.TraceRecords[1].Message.StartsWith("Finished deserializing Newtonsoft.Json.Tests.Serialization.SpecifiedTestClass. Path ''")); Assert.IsNull(deserialized.Name); @@ -843,10 +843,10 @@ Newtonsoft.Json Error: 0 : Error! deserialized = JsonConvert.DeserializeObject(json, new JsonSerializerSettings { TraceWriter = traceWriter }); - Assert.AreEqual("Started deserializing Newtonsoft.Json.Tests.Serialization.SpecifiedTestClass. Path 'Name', line 2, position 10.", traceWriter.TraceRecords[0].Message); - Assert.AreEqual("IsSpecified for property 'Name' on Newtonsoft.Json.Tests.Serialization.SpecifiedTestClass set to true. Path 'Name', line 2, position 18.", traceWriter.TraceRecords[1].Message); - Assert.AreEqual("IsSpecified for property 'Weight' on Newtonsoft.Json.Tests.Serialization.SpecifiedTestClass set to true. Path 'Weight', line 4, position 14.", traceWriter.TraceRecords[2].Message); - Assert.AreEqual("IsSpecified for property 'Height' on Newtonsoft.Json.Tests.Serialization.SpecifiedTestClass set to true. Path 'Height', line 5, position 14.", traceWriter.TraceRecords[3].Message); + Assert.AreEqual("Started deserializing Newtonsoft.Json.Tests.Serialization.SpecifiedTestClass. Path 'Name', line 2, position 9.", traceWriter.TraceRecords[0].Message); + Assert.AreEqual("IsSpecified for property 'Name' on Newtonsoft.Json.Tests.Serialization.SpecifiedTestClass set to true. Path 'Name', line 2, position 17.", traceWriter.TraceRecords[1].Message); + Assert.AreEqual("IsSpecified for property 'Weight' on Newtonsoft.Json.Tests.Serialization.SpecifiedTestClass set to true. Path 'Weight', line 4, position 13.", traceWriter.TraceRecords[2].Message); + Assert.AreEqual("IsSpecified for property 'Height' on Newtonsoft.Json.Tests.Serialization.SpecifiedTestClass set to true. Path 'Height', line 5, position 13.", traceWriter.TraceRecords[3].Message); Assert.IsTrue(traceWriter.TraceRecords[4].Message.StartsWith("Finished deserializing Newtonsoft.Json.Tests.Serialization.SpecifiedTestClass. Path ''")); Assert.AreEqual("James", deserialized.Name); diff --git a/Src/Newtonsoft.Json.Tests/Serialization/TypeNameHandlingTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/TypeNameHandlingTests.cs index 63553aaf..5d65909c 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/TypeNameHandlingTests.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/TypeNameHandlingTests.cs @@ -517,7 +517,7 @@ namespace Newtonsoft.Json.Tests.Serialization { TypeNameHandling = TypeNameHandling.Objects }); - }, "Type specified in JSON 'Newtonsoft.Json.Tests.TestObjects.Employee' was not resolved. Path '$type', line 3, position 56."); + }, "Type specified in JSON 'Newtonsoft.Json.Tests.TestObjects.Employee' was not resolved. Path '$type', line 3, position 55."); } public interface ICorrelatedMessage diff --git a/Src/Newtonsoft.Json/JsonPosition.cs b/Src/Newtonsoft.Json/JsonPosition.cs index bfb64660..fd8deef4 100644 --- a/Src/Newtonsoft.Json/JsonPosition.cs +++ b/Src/Newtonsoft.Json/JsonPosition.cs @@ -61,9 +61,6 @@ namespace Newtonsoft.Json switch (Type) { case JsonContainerType.Object: - if (sb.Length > 0) - sb.Append('.'); - string propertyName = PropertyName; if (propertyName.IndexOfAny(SpecialCharacters) != -1) { @@ -73,6 +70,9 @@ namespace Newtonsoft.Json } else { + if (sb.Length > 0) + sb.Append('.'); + sb.Append(propertyName); } break; diff --git a/Src/Newtonsoft.Json/JsonTextReader.cs b/Src/Newtonsoft.Json/JsonTextReader.cs index 54343a1b..c02c7799 100644 --- a/Src/Newtonsoft.Json/JsonTextReader.cs +++ b/Src/Newtonsoft.Json/JsonTextReader.cs @@ -104,7 +104,7 @@ namespace Newtonsoft.Json private void OnNewLine(int pos) { _lineNumber++; - _lineStartPos = pos - 1; + _lineStartPos = pos; } private void ParseString(char quote) @@ -1657,7 +1657,7 @@ namespace Newtonsoft.Json { get { - if (CurrentState == State.Start && LinePosition == 0) + if (CurrentState == State.Start && LinePosition == 0 && TokenType != JsonToken.Comment) return 0; return _lineNumber;