diff --git a/Src/Newtonsoft.Json.TestConsole/Properties/AssemblyInfo.cs b/Src/Newtonsoft.Json.TestConsole/Properties/AssemblyInfo.cs index a8ff3365..a4d95c35 100644 --- a/Src/Newtonsoft.Json.TestConsole/Properties/AssemblyInfo.cs +++ b/Src/Newtonsoft.Json.TestConsole/Properties/AssemblyInfo.cs @@ -33,4 +33,4 @@ using System.Runtime.InteropServices; // by using the '*' as shown below: // [assembly: AssemblyVersion("6.0.0.0")] [assembly: AssemblyVersion("6.0.0.0")] -[assembly: AssemblyFileVersion("6.0.6.17817")] +[assembly: AssemblyFileVersion("6.0.6.17818")] diff --git a/Src/Newtonsoft.Json.Tests/Converters/JsonValueConverterTests.cs b/Src/Newtonsoft.Json.Tests/Converters/JsonValueConverterTests.cs index 42e4307e..718ae61f 100644 --- a/Src/Newtonsoft.Json.Tests/Converters/JsonValueConverterTests.cs +++ b/Src/Newtonsoft.Json.Tests/Converters/JsonValueConverterTests.cs @@ -43,19 +43,19 @@ using System.Linq; namespace Newtonsoft.Json.Tests.Converters { - [TestFixture] - public class JsonValueConverterTests : TestFixtureBase - { - public class Computer + [TestFixture] + public class JsonValueConverterTests : TestFixtureBase { - public string Cpu { get; set; } - public List Drives { get; set; } - } + public class Computer + { + public string Cpu { get; set; } + public List Drives { get; set; } + } - [Test] - public void WriteJson() - { - JsonObject o = JsonObject.Parse(@"{ + [Test] + public void WriteJson() + { + JsonObject o = JsonObject.Parse(@"{ ""CPU"": ""Intel"", ""Drives"": [ ""DVD read/writer"", @@ -63,21 +63,21 @@ namespace Newtonsoft.Json.Tests.Converters ] }"); - StringWriter sw = new StringWriter(); - JsonTextWriter writer = new JsonTextWriter(sw); + StringWriter sw = new StringWriter(); + JsonTextWriter writer = new JsonTextWriter(sw); - JsonValueConverter converter = new JsonValueConverter(); - converter.WriteJson(writer, o, null); + JsonValueConverter converter = new JsonValueConverter(); + converter.WriteJson(writer, o, null); - string json = sw.ToString(); + string json = sw.ToString(); - Assert.AreEqual(@"{""Drives"":[""DVD read/writer"",""500 gigabyte hard drive""],""CPU"":""Intel""}", json); - } + Assert.AreEqual(@"{""Drives"":[""DVD read/writer"",""500 gigabyte hard drive""],""CPU"":""Intel""}", json); + } - [Test] - public void ReadJson() - { - string json = @"{ + [Test] + public void ReadJson() + { + string json = @"{ ""CPU"": ""Intel"", ""Drives"": [ ""DVD read/writer"", @@ -85,21 +85,21 @@ namespace Newtonsoft.Json.Tests.Converters ] }"; - JsonTextReader writer = new JsonTextReader(new StringReader(json)); + JsonTextReader writer = new JsonTextReader(new StringReader(json)); - JsonValueConverter converter = new JsonValueConverter(); - JsonObject o = (JsonObject)converter.ReadJson(writer, typeof(JsonObject), null, null); + JsonValueConverter converter = new JsonValueConverter(); + JsonObject o = (JsonObject) converter.ReadJson(writer, typeof (JsonObject), null, null); - Assert.AreEqual(2, o.Count); - Assert.AreEqual("Intel", o.GetNamedString("CPU")); - Assert.AreEqual("DVD read/writer", o.GetNamedArray("Drives")[0].GetString()); - Assert.AreEqual("500 gigabyte hard drive", o.GetNamedArray("Drives")[1].GetString()); - } + Assert.AreEqual(2, o.Count); + Assert.AreEqual("Intel", o.GetNamedString("CPU")); + Assert.AreEqual("DVD read/writer", o.GetNamedArray("Drives")[0].GetString()); + Assert.AreEqual("500 gigabyte hard drive", o.GetNamedArray("Drives")[1].GetString()); + } - [Test] - public void ReadJsonComments() - { - string json = @"{/*comment!*/ + [Test] + public void ReadJsonComments() + { + string json = @"{/*comment!*/ ""CPU"": ""Intel"",/*comment!*/ ""Drives"": [/*comment!*/ ""DVD read/writer"", @@ -107,155 +107,156 @@ namespace Newtonsoft.Json.Tests.Converters ]/*comment!*/ }"; - JsonTextReader writer = new JsonTextReader(new StringReader(json)); + JsonTextReader writer = new JsonTextReader(new StringReader(json)); - JsonValueConverter converter = new JsonValueConverter(); - JsonObject o = (JsonObject)converter.ReadJson(writer, typeof(JsonObject), null, null); + JsonValueConverter converter = new JsonValueConverter(); + JsonObject o = (JsonObject) converter.ReadJson(writer, typeof (JsonObject), null, null); - Assert.AreEqual(2, o.Count); - Assert.AreEqual("Intel", o.GetNamedString("CPU")); - Assert.AreEqual("DVD read/writer", o.GetNamedArray("Drives")[0].GetString()); - Assert.AreEqual("500 gigabyte hard drive", o.GetNamedArray("Drives")[1].GetString()); - } + Assert.AreEqual(2, o.Count); + Assert.AreEqual("Intel", o.GetNamedString("CPU")); + Assert.AreEqual("DVD read/writer", o.GetNamedArray("Drives")[0].GetString()); + Assert.AreEqual("500 gigabyte hard drive", o.GetNamedArray("Drives")[1].GetString()); + } - [Test] - public void ReadJsonNullValue() - { - string json = "null"; + [Test] + public void ReadJsonNullValue() + { + string json = "null"; - JsonTextReader writer = new JsonTextReader(new StringReader(json)); + JsonTextReader writer = new JsonTextReader(new StringReader(json)); - JsonValueConverter converter = new JsonValueConverter(); - JsonValue v = (JsonValue)converter.ReadJson(writer, typeof(JsonValue), null, null); + JsonValueConverter converter = new JsonValueConverter(); + JsonValue v = (JsonValue) converter.ReadJson(writer, typeof (JsonValue), null, null); - Assert.AreEqual(JsonValueType.Null, v.ValueType); - } + Assert.AreEqual(JsonValueType.Null, v.ValueType); + } - [Test] - public void ReadJsonUnsupportedValue() - { - string json = "undefined"; + [Test] + public void ReadJsonUnsupportedValue() + { + string json = "undefined"; - JsonTextReader writer = new JsonTextReader(new StringReader(json)); + JsonTextReader writer = new JsonTextReader(new StringReader(json)); - JsonValueConverter converter = new JsonValueConverter(); + JsonValueConverter converter = new JsonValueConverter(); - ExceptionAssert.Throws(() => - { - converter.ReadJson(writer, typeof(JsonValue), null, null); - }, "Unexpected or unsupported token: Undefined. Path '', line 1, position 9."); - } + ExceptionAssert.Throws(() => + { + converter.ReadJson(writer, typeof (JsonValue), null, null); + }, "Unexpected or unsupported token: Undefined. Path '', line 1, position 9."); + } - [Test] - public void ReadJsonUnexpectedEndInArray() - { - string json = "["; + [Test] + public void ReadJsonUnexpectedEndInArray() + { + string json = "["; - JsonTextReader writer = new JsonTextReader(new StringReader(json)); + JsonTextReader writer = new JsonTextReader(new StringReader(json)); - JsonValueConverter converter = new JsonValueConverter(); + JsonValueConverter converter = new JsonValueConverter(); - ExceptionAssert.Throws(() => - { - converter.ReadJson(writer, typeof(JsonValue), null, null); - }, "Unexpected end. Path '', line 1, position 1."); - } + ExceptionAssert.Throws(() => + { + converter.ReadJson(writer, typeof (JsonValue), null, null); + }, "Unexpected end. Path '', line 1, position 1."); + } - [Test] - public void ReadJsonUnexpectedEndAfterComment() - { - string json = "[/*comment!*/"; + [Test] + public void ReadJsonUnexpectedEndAfterComment() + { + string json = "[/*comment!*/"; - JsonTextReader writer = new JsonTextReader(new StringReader(json)); + JsonTextReader writer = new JsonTextReader(new StringReader(json)); - JsonValueConverter converter = new JsonValueConverter(); + JsonValueConverter converter = new JsonValueConverter(); - ExceptionAssert.Throws(() => - { - converter.ReadJson(writer, typeof(JsonValue), null, null); - }, "Unexpected end. Path '', line 1, position 13."); - } + ExceptionAssert.Throws(() => + { + converter.ReadJson(writer, typeof (JsonValue), null, null); + }, "Unexpected end. Path '', line 1, position 13."); + } - [Test] - public void ReadJsonUnexpectedEndInObject() - { - string json = "{'hi':"; + [Test] + public void ReadJsonUnexpectedEndInObject() + { + string json = "{'hi':"; - JsonTextReader writer = new JsonTextReader(new StringReader(json)); + JsonTextReader writer = new JsonTextReader(new StringReader(json)); - JsonValueConverter converter = new JsonValueConverter(); + JsonValueConverter converter = new JsonValueConverter(); - ExceptionAssert.Throws(() => - { - converter.ReadJson(writer, typeof(JsonValue), null, null); - }, "Unexpected end. Path 'hi', line 1, position 6."); - } + ExceptionAssert.Throws(() => + { + converter.ReadJson(writer, typeof (JsonValue), null, null); + }, "Unexpected end. Path 'hi', line 1, position 6."); + } - [Test] - public void ReadJsonBadJsonType() - { - string json = "null"; + [Test] + public void ReadJsonBadJsonType() + { + string json = "null"; - JsonTextReader writer = new JsonTextReader(new StringReader(json)); + JsonTextReader writer = new JsonTextReader(new StringReader(json)); - JsonValueConverter converter = new JsonValueConverter(); + JsonValueConverter converter = new JsonValueConverter(); - ExceptionAssert.Throws(() => - { - converter.ReadJson(writer, typeof(JsonObject), null, null); - }, "Could not convert 'Windows.Data.Json.JsonValue' to 'Windows.Data.Json.JsonObject'. Path '', line 1, position 4."); - } + ExceptionAssert.Throws(() => + { + converter.ReadJson(writer, typeof (JsonObject), null, null); + }, + "Could not convert 'Windows.Data.Json.JsonValue' to 'Windows.Data.Json.JsonObject'. Path '', line 1, position 4."); + } - [Test] - public void JsonConvertDeserialize() - { - string json = @"[ + [Test] + public void JsonConvertDeserialize() + { + string json = @"[ ""DVD read/writer"", ""500 gigabyte hard drive"" ]"; - JsonArray a = JsonConvert.DeserializeObject(json); + JsonArray a = JsonConvert.DeserializeObject(json); - Assert.AreEqual(2, a.Count); - Assert.AreEqual("DVD read/writer", a[0].GetString()); - Assert.AreEqual("500 gigabyte hard drive", a[1].GetString()); - } + Assert.AreEqual(2, a.Count); + Assert.AreEqual("DVD read/writer", a[0].GetString()); + Assert.AreEqual("500 gigabyte hard drive", a[1].GetString()); + } - [Test] - public void JsonConvertSerialize() - { - JsonArray a = JsonArray.Parse(@"[ + [Test] + public void JsonConvertSerialize() + { + JsonArray a = JsonArray.Parse(@"[ ""DVD read/writer"", ""500 gigabyte hard drive"" ]"); - string json = JsonConvert.SerializeObject(a, Formatting.Indented); + string json = JsonConvert.SerializeObject(a, Formatting.Indented); - Assert.AreEqual(@"[ + Assert.AreEqual(@"[ ""DVD read/writer"", ""500 gigabyte hard drive"" ]", json); - } + } - [Test] - public void SerializeDouble() - { - JsonObject o = new JsonObject(); - o["zero"] = JsonValue.CreateNumberValue(0); - o["int"] = JsonValue.CreateNumberValue(1); - o["smallfraction"] = JsonValue.CreateNumberValue(3.0000000000000009); - o["double"] = JsonValue.CreateNumberValue(1.1); - o["probablyint"] = JsonValue.CreateNumberValue(1.0); - o["Epsilon"] = JsonValue.CreateNumberValue(double.Epsilon); - o["MinValue"] = JsonValue.CreateNumberValue(double.MinValue); - o["MaxValue"] = JsonValue.CreateNumberValue(double.MaxValue); - o["NaN"] = JsonValue.CreateNumberValue(double.NaN); - o["NegativeInfinity"] = JsonValue.CreateNumberValue(double.NegativeInfinity); - o["PositiveInfinity"] = JsonValue.CreateNumberValue(double.PositiveInfinity); + [Test] + public void SerializeDouble() + { + JsonObject o = new JsonObject(); + o["zero"] = JsonValue.CreateNumberValue(0); + o["int"] = JsonValue.CreateNumberValue(1); + o["smallfraction"] = JsonValue.CreateNumberValue(3.0000000000000009); + o["double"] = JsonValue.CreateNumberValue(1.1); + o["probablyint"] = JsonValue.CreateNumberValue(1.0); + o["Epsilon"] = JsonValue.CreateNumberValue(double.Epsilon); + o["MinValue"] = JsonValue.CreateNumberValue(double.MinValue); + o["MaxValue"] = JsonValue.CreateNumberValue(double.MaxValue); + o["NaN"] = JsonValue.CreateNumberValue(double.NaN); + o["NegativeInfinity"] = JsonValue.CreateNumberValue(double.NegativeInfinity); + o["PositiveInfinity"] = JsonValue.CreateNumberValue(double.PositiveInfinity); - string json = JsonConvert.SerializeObject(o, Formatting.Indented); + string json = JsonConvert.SerializeObject(o, Formatting.Indented); - Assert.AreEqual(@"{ + Assert.AreEqual(@"{ ""PositiveInfinity"": ""Infinity"", ""NegativeInfinity"": ""-Infinity"", ""MinValue"": -1.7976931348623157E+308, @@ -268,12 +269,12 @@ namespace Newtonsoft.Json.Tests.Converters ""smallfraction"": 3.0000000000000009, ""probablyint"": 1 }", json); - } + } - [Test] - public void DeserializePerformance() - { - string json = @"{ + [Test] + public void DeserializePerformance() + { + string json = @"{ ""CPU"": ""Intel"", ""Drives"": [ ""DVD read/writer"", @@ -281,46 +282,46 @@ namespace Newtonsoft.Json.Tests.Converters ] }"; - Stopwatch timer = new Stopwatch(); - timer.Start(); - for (int i = 0; i < 100000; i++) - { - JsonObject o = JsonObject.Parse(json); - } - timer.Stop(); + Stopwatch timer = new Stopwatch(); + timer.Start(); + for (int i = 0; i < 100000; i++) + { + JsonObject o = JsonObject.Parse(json); + } + timer.Stop(); - string winrt = timer.Elapsed.TotalSeconds.ToString(); + string winrt = timer.Elapsed.TotalSeconds.ToString(); - timer = new Stopwatch(); - timer.Start(); - for (int i = 0; i < 100000; i++) - { - JObject o = JObject.Parse(json); - } - timer.Stop(); + timer = new Stopwatch(); + timer.Start(); + for (int i = 0; i < 100000; i++) + { + JObject o = JObject.Parse(json); + } + timer.Stop(); - string linq = timer.Elapsed.TotalSeconds.ToString(); + string linq = timer.Elapsed.TotalSeconds.ToString(); - // warm up - JsonConvert.DeserializeObject(json); + // warm up + JsonConvert.DeserializeObject(json); - timer = new Stopwatch(); - timer.Start(); - for (int i = 0; i < 100000; i++) - { - Computer o = JsonConvert.DeserializeObject(json); - } - timer.Stop(); + timer = new Stopwatch(); + timer.Start(); + for (int i = 0; i < 100000; i++) + { + Computer o = JsonConvert.DeserializeObject(json); + } + timer.Stop(); - string jsonnet = timer.Elapsed.TotalSeconds.ToString(); + string jsonnet = timer.Elapsed.TotalSeconds.ToString(); - throw new Exception(string.Format("winrt: {0}, jsonnet: {1}, jsonnet linq: {2}", winrt, jsonnet, linq)); - } + Debug.WriteLine("winrt: {0}, jsonnet: {1}, jsonnet linq: {2}", winrt, jsonnet, linq); + } - [Test] - public void SerializePerformance() - { - string json = @"{ + [Test] + public void SerializePerformance() + { + string json = @"{ ""CPU"": ""Intel"", ""Drives"": [ ""DVD read/writer"", @@ -328,46 +329,46 @@ namespace Newtonsoft.Json.Tests.Converters ] }"; - JsonObject o = JsonObject.Parse(json); - JObject o1 = JObject.Parse(json); - Computer o2 = JsonConvert.DeserializeObject(json); + JsonObject o = JsonObject.Parse(json); + JObject o1 = JObject.Parse(json); + Computer o2 = JsonConvert.DeserializeObject(json); - Stopwatch timer = new Stopwatch(); - timer.Start(); - for (int i = 0; i < 100000; i++) - { - o.Stringify(); - } - timer.Stop(); + Stopwatch timer = new Stopwatch(); + timer.Start(); + for (int i = 0; i < 100000; i++) + { + o.Stringify(); + } + timer.Stop(); - string winrt = timer.Elapsed.TotalSeconds.ToString(); + string winrt = timer.Elapsed.TotalSeconds.ToString(); - timer.Start(); - for (int i = 0; i < 100000; i++) - { - o1.ToString(Formatting.None); - } - timer.Stop(); + timer.Start(); + for (int i = 0; i < 100000; i++) + { + o1.ToString(Formatting.None); + } + timer.Stop(); - string linq = timer.Elapsed.TotalSeconds.ToString(); + string linq = timer.Elapsed.TotalSeconds.ToString(); - timer = new Stopwatch(); - timer.Start(); - for (int i = 0; i < 100000; i++) - { - JsonConvert.SerializeObject(o); - } - timer.Stop(); + timer = new Stopwatch(); + timer.Start(); + for (int i = 0; i < 100000; i++) + { + JsonConvert.SerializeObject(o); + } + timer.Stop(); - string jsonnet = timer.Elapsed.TotalSeconds.ToString(); + string jsonnet = timer.Elapsed.TotalSeconds.ToString(); - throw new Exception(string.Format("winrt: {0}, jsonnet: {1}, jsonnet linq: {2}", winrt, jsonnet, linq)); - } + Debug.WriteLine("winrt: {0}, jsonnet: {1}, jsonnet linq: {2}", winrt, jsonnet, linq); + } - [Test] - public void ParseJson() - { - string json = @"{ + [Test] + public void ParseJson() + { + string json = @"{ ""channel"": { ""title"": ""James Newton-King"", ""link"": ""http://james.newtonking.com"", @@ -386,67 +387,74 @@ namespace Newtonsoft.Json.Tests.Converters } }"; - // Windows.Data.Json - // ----------------- - JsonObject jsonObject = JsonObject.Parse(json); - string itemTitle1 = jsonObject["channel"].GetObject()["item"].GetArray()[0].GetObject()["title"].GetString(); - - // LINQ to JSON - // ------------ - JObject jObject = JObject.Parse(json); - string itemTitle2 = (string)jObject["channel"]["item"][0]["title"]; - } + // Windows.Data.Json + // ----------------- + JsonObject jsonObject = JsonObject.Parse(json); + string itemTitle1 = jsonObject["channel"].GetObject()["item"].GetArray()[0].GetObject()["title"].GetString(); - [Test] - public void CreateJson() - { - // Windows.Data.Json - // ----------------- - JsonObject jsonObject = new JsonObject + // LINQ to JSON + // ------------ + JObject jObject = JObject.Parse(json); + string itemTitle2 = (string) jObject["channel"]["item"][0]["title"]; + } + + [Test] + public void CreateJson() { - {"CPU", JsonValue.CreateStringValue("Intel")}, - {"Drives", new JsonArray { - JsonValue.CreateStringValue("DVD read/writer"), - JsonValue.CreateStringValue("500 gigabyte hard drive") - } - } - }; - string json1 = jsonObject.Stringify(); + // Windows.Data.Json + // ----------------- + JsonObject jsonObject = new JsonObject + { + {"CPU", JsonValue.CreateStringValue("Intel")}, + { + "Drives", new JsonArray + { + JsonValue.CreateStringValue("DVD read/writer"), + JsonValue.CreateStringValue("500 gigabyte hard drive") + } + } + }; + string json1 = jsonObject.Stringify(); - // LINQ to JSON - // ------------ - JObject jObject = new JObject + // LINQ to JSON + // ------------ + JObject jObject = new JObject + { + {"CPU", "Intel"}, + { + "Drives", new JArray + { + "DVD read/writer", + "500 gigabyte hard drive" + } + } + }; + string json2 = jObject.ToString(); + } + + [Test] + public void Converting() { - {"CPU", "Intel"}, - {"Drives", new JArray { - "DVD read/writer", - "500 gigabyte hard drive" - } - } - }; - string json2 = jObject.ToString(); + JsonObject jsonObject = new JsonObject + { + {"CPU", JsonValue.CreateStringValue("Intel")}, + { + "Drives", new JsonArray + { + JsonValue.CreateStringValue("DVD read/writer"), + JsonValue.CreateStringValue("500 gigabyte hard drive") + } + } + }; + + // convert Windows.Data.Json to LINQ to JSON + JObject o = JObject.FromObject(jsonObject); + + // convert LINQ to JSON to Windows.Data.Json + JArray a = (JArray) o["Drives"]; + JsonArray jsonArray = a.ToObject(); + } } - - [Test] - public void Converting() - { - JsonObject jsonObject = new JsonObject - { - {"CPU", JsonValue.CreateStringValue("Intel")}, - {"Drives", new JsonArray { - JsonValue.CreateStringValue("DVD read/writer"), - JsonValue.CreateStringValue("500 gigabyte hard drive") - } - } - }; - - // convert Windows.Data.Json to LINQ to JSON - JObject o = JObject.FromObject(jsonObject); - - // convert LINQ to JSON to Windows.Data.Json - JArray a = (JArray)o["Drives"]; - JsonArray jsonArray = a.ToObject(); - } - } } + #endif \ No newline at end of file diff --git a/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs b/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs index e62d47c2..3557f671 100644 --- a/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs +++ b/Src/Newtonsoft.Json.Tests/JsonTextReaderTest.cs @@ -3151,6 +3151,32 @@ null//comment Assert.IsTrue(reader.Read()); } + + [Test] + public void EscapedPathInExceptionMessage() + { + string json = @"{ + ""frameworks"": { + ""aspnetcore50"": { + ""dependencies"": { + ""System.Xml.ReaderWriter"": { + ""source"": !!! !!! + } + } + } + } +}"; + + ExceptionAssert.Throws( + () => + { + JsonTextReader reader = new JsonTextReader(new StringReader(json)); + while (reader.Read()) + { + } + }, + "Unexpected character encountered while parsing value: !. Path 'frameworks.aspnetcore50.dependencies.['System.Xml.ReaderWriter'].source', line 6, position 21."); + } } public class ToggleReaderError : TextReader diff --git a/Src/Newtonsoft.Json.Tests/Linq/JsonPath/JPathParseTests.cs b/Src/Newtonsoft.Json.Tests/Linq/JsonPath/JPathParseTests.cs index e2da5a5a..5e0fa9d3 100644 --- a/Src/Newtonsoft.Json.Tests/Linq/JsonPath/JPathParseTests.cs +++ b/Src/Newtonsoft.Json.Tests/Linq/JsonPath/JPathParseTests.cs @@ -643,5 +643,18 @@ namespace Newtonsoft.Json.Tests.Linq.JsonPath { ExceptionAssert.Throws(() => { new JPath("[1]Blah"); }, "Unexpected character following indexer: B"); } + + [Test] + public void PropertyFollowingEscapedPropertyName() + { + JPath path = new JPath("frameworks.aspnetcore50.dependencies.['System.Xml.ReaderWriter'].source"); + Assert.AreEqual(5, path.Filters.Count); + + Assert.AreEqual("frameworks", ((FieldFilter)path.Filters[0]).Name); + Assert.AreEqual("aspnetcore50", ((FieldFilter)path.Filters[1]).Name); + Assert.AreEqual("dependencies", ((FieldFilter)path.Filters[2]).Name); + Assert.AreEqual("System.Xml.ReaderWriter", ((FieldFilter)path.Filters[3]).Name); + Assert.AreEqual("source", ((FieldFilter)path.Filters[4]).Name); + } } } \ No newline at end of file diff --git a/Src/Newtonsoft.Json.Tests/Linq/LinqToJsonTest.cs b/Src/Newtonsoft.Json.Tests/Linq/LinqToJsonTest.cs index 55c116a7..bf44a97e 100644 --- a/Src/Newtonsoft.Json.Tests/Linq/LinqToJsonTest.cs +++ b/Src/Newtonsoft.Json.Tests/Linq/LinqToJsonTest.cs @@ -184,6 +184,55 @@ undefined Assert.AreEqual("person.$id", idProperty.Path); } + [Test] + public void EscapedPath() + { + string json = @"{ + ""frameworks"": { + ""aspnetcore50"": { + ""dependencies"": { + ""System.Xml.ReaderWriter"": { + ""source"": ""NuGet"" + } + } + } + } +}"; + + JObject o = JObject.Parse(json); + + JToken v1 = o["frameworks"]["aspnetcore50"]["dependencies"]["System.Xml.ReaderWriter"]["source"]; + + Console.WriteLine(v1.Path); + + JToken v2 = o.SelectToken(v1.Path); + + Assert.AreEqual(v1, v2); + } + + [Test] + public void EscapedPathTests() + { + EscapedPathAssert("this has spaces", "['this has spaces']"); + EscapedPathAssert("(RoundBraces)", "['(RoundBraces)']"); + EscapedPathAssert("[SquareBraces]", "['[SquareBraces]']"); + EscapedPathAssert("this.has.dots", "['this.has.dots']"); + } + + private void EscapedPathAssert(string propertyName, string expectedPath) + { + int v1 = int.MaxValue; + JValue value = new JValue(v1); + + JObject o = new JObject(new JProperty(propertyName, value)); + + Assert.AreEqual(expectedPath, value.Path); + + JValue selectedValue = (JValue)o.SelectToken(value.Path); + + Assert.AreEqual(value, selectedValue); + } + [Test] public void ForEach() { diff --git a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.WinRT.csproj b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.WinRT.csproj index 6fcbc2c7..1d218cb2 100644 --- a/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.WinRT.csproj +++ b/Src/Newtonsoft.Json.Tests/Newtonsoft.Json.Tests.WinRT.csproj @@ -16,6 +16,7 @@ {BC8A1FFA-BEE3-4634-8014-F334798102B3};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} Newtonsoft.Json.Tests.WinRT_TemporaryKey.pfx 3116117C65F73A227A0BDC35F584F04145BA4BB7 + False true @@ -381,6 +382,7 @@ ..\packages\Microsoft.Bcl.Immutable.1.1.20-beta\lib\portable-net45+win8\System.Collections.Immutable.dll + True diff --git a/Src/Newtonsoft.Json.Tests/Properties/AssemblyInfo.cs b/Src/Newtonsoft.Json.Tests/Properties/AssemblyInfo.cs index a27bedea..e7b27275 100644 --- a/Src/Newtonsoft.Json.Tests/Properties/AssemblyInfo.cs +++ b/Src/Newtonsoft.Json.Tests/Properties/AssemblyInfo.cs @@ -74,4 +74,4 @@ using System.Security; // by using the '*' as shown below: [assembly: AssemblyVersion("6.0.0.0")] -[assembly: AssemblyFileVersion("6.0.6.17817")] +[assembly: AssemblyFileVersion("6.0.6.17818")] diff --git a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs index a55c975a..caf65341 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs @@ -3215,7 +3215,7 @@ Path '', line 1, position 1."); } catch (JsonSerializationException ex) { - Assert.IsTrue(ex.Message.StartsWith("Could not convert string 'Newtonsoft.Json.Tests.TestObjects.Person' to dictionary key type 'Newtonsoft.Json.Tests.TestObjects.Person'. Create a TypeConverter to convert from the string to the key type object. Path 'Newtonsoft.Json.Tests.TestObjects.Person'")); + Assert.IsTrue(ex.Message.StartsWith("Could not convert string 'Newtonsoft.Json.Tests.TestObjects.Person' to dictionary key type 'Newtonsoft.Json.Tests.TestObjects.Person'. Create a TypeConverter to convert from the string to the key type object. Path '['Newtonsoft.Json.Tests.TestObjects.Person']'")); } } diff --git a/Src/Newtonsoft.Json/JsonPosition.cs b/Src/Newtonsoft.Json/JsonPosition.cs index 67e80c63..7bd879e7 100644 --- a/Src/Newtonsoft.Json/JsonPosition.cs +++ b/Src/Newtonsoft.Json/JsonPosition.cs @@ -41,6 +41,8 @@ namespace Newtonsoft.Json internal struct JsonPosition { + private static readonly char[] SpecialCharacters = {'.', ' ', '[', ']', '(', ')'}; + internal JsonContainerType Type; internal int Position; internal string PropertyName; @@ -61,7 +63,18 @@ namespace Newtonsoft.Json case JsonContainerType.Object: if (sb.Length > 0) sb.Append('.'); - sb.Append(PropertyName); + + string propertyName = PropertyName; + if (propertyName.IndexOfAny(SpecialCharacters) != -1) + { + sb.Append(@"['"); + sb.Append(propertyName); + sb.Append(@"']"); + } + else + { + sb.Append(propertyName); + } break; case JsonContainerType.Array: case JsonContainerType.Constructor: diff --git a/Src/Newtonsoft.Json/Linq/JToken.cs b/Src/Newtonsoft.Json/Linq/JToken.cs index 4596bf3b..da7486ff 100644 --- a/Src/Newtonsoft.Json/Linq/JToken.cs +++ b/Src/Newtonsoft.Json/Linq/JToken.cs @@ -188,7 +188,7 @@ namespace Newtonsoft.Json.Linq IList ancestors = Ancestors().Reverse().ToList(); ancestors.Add(this); - StringBuilder sb = new StringBuilder(); + IList positions = new List(); for (int i = 0; i < ancestors.Count; i++) { JToken current = ancestors[i]; @@ -204,25 +204,19 @@ namespace Newtonsoft.Json.Linq { case JTokenType.Property: JProperty property = (JProperty)current; - - if (sb.Length > 0) - sb.Append('.'); - - sb.Append(property.Name); + positions.Add(new JsonPosition(JsonContainerType.Object) { PropertyName = property.Name }); break; case JTokenType.Array: case JTokenType.Constructor: int index = ((IList)current).IndexOf(next); - sb.Append('['); - sb.Append(index); - sb.Append(']'); + positions.Add(new JsonPosition(JsonContainerType.Array) { Position = index }); break; } } } - return sb.ToString(); + return JsonPosition.BuildPath(positions); } } diff --git a/Src/Newtonsoft.Json/Linq/JsonPath/JPath.cs b/Src/Newtonsoft.Json/Linq/JsonPath/JPath.cs index 58b94ab9..0941f3e4 100644 --- a/Src/Newtonsoft.Json/Linq/JsonPath/JPath.cs +++ b/Src/Newtonsoft.Json/Linq/JsonPath/JPath.cs @@ -609,24 +609,17 @@ namespace Newtonsoft.Json.Linq.JsonPath private PathFilter ParseQuotedField(char indexerCloseChar) { - //_currentIndex++; - //int start = _currentIndex; - List fields = null; while (_currentIndex < _expression.Length) { string field = ReadQuotedString(); - //_currentIndex++; - //EnsureLength("Path ended with open indexer."); EatWhitespace(); EnsureLength("Path ended with open indexer."); if (_expression[_currentIndex] == indexerCloseChar) { - _currentIndex++; - if (fields != null) { fields.Add(field); diff --git a/Src/Newtonsoft.Json/Properties/AssemblyInfo.cs b/Src/Newtonsoft.Json/Properties/AssemblyInfo.cs index d15efddc..42b9e366 100644 --- a/Src/Newtonsoft.Json/Properties/AssemblyInfo.cs +++ b/Src/Newtonsoft.Json/Properties/AssemblyInfo.cs @@ -91,5 +91,5 @@ using System.Security; // by using the '*' as shown below: [assembly: AssemblyVersion("6.0.0.0")] -[assembly: AssemblyFileVersion("6.0.6.17817")] +[assembly: AssemblyFileVersion("6.0.6.17818")] [assembly: CLSCompliant(true)]