-Fixed jsonpath error when parsing a property that follows an escaped property
-Changed reader/writer/token path to escape property names containing special characters
This commit is contained in:
@@ -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")]
|
||||
|
||||
@@ -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<string> Drives { get; set; }
|
||||
}
|
||||
public class Computer
|
||||
{
|
||||
public string Cpu { get; set; }
|
||||
public List<string> 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<JsonException>(() =>
|
||||
{
|
||||
converter.ReadJson(writer, typeof(JsonValue), null, null);
|
||||
}, "Unexpected or unsupported token: Undefined. Path '', line 1, position 9.");
|
||||
}
|
||||
ExceptionAssert.Throws<JsonException>(() =>
|
||||
{
|
||||
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<JsonException>(() =>
|
||||
{
|
||||
converter.ReadJson(writer, typeof(JsonValue), null, null);
|
||||
}, "Unexpected end. Path '', line 1, position 1.");
|
||||
}
|
||||
ExceptionAssert.Throws<JsonException>(() =>
|
||||
{
|
||||
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<JsonException>(() =>
|
||||
{
|
||||
converter.ReadJson(writer, typeof(JsonValue), null, null);
|
||||
}, "Unexpected end. Path '', line 1, position 13.");
|
||||
}
|
||||
ExceptionAssert.Throws<JsonException>(() =>
|
||||
{
|
||||
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<JsonException>(() =>
|
||||
{
|
||||
converter.ReadJson(writer, typeof(JsonValue), null, null);
|
||||
}, "Unexpected end. Path 'hi', line 1, position 6.");
|
||||
}
|
||||
ExceptionAssert.Throws<JsonException>(() =>
|
||||
{
|
||||
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<JsonException>(() =>
|
||||
{
|
||||
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<JsonException>(() =>
|
||||
{
|
||||
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<JsonArray>(json);
|
||||
JsonArray a = JsonConvert.DeserializeObject<JsonArray>(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<Computer>(json);
|
||||
// warm up
|
||||
JsonConvert.DeserializeObject<Computer>(json);
|
||||
|
||||
timer = new Stopwatch();
|
||||
timer.Start();
|
||||
for (int i = 0; i < 100000; i++)
|
||||
{
|
||||
Computer o = JsonConvert.DeserializeObject<Computer>(json);
|
||||
}
|
||||
timer.Stop();
|
||||
timer = new Stopwatch();
|
||||
timer.Start();
|
||||
for (int i = 0; i < 100000; i++)
|
||||
{
|
||||
Computer o = JsonConvert.DeserializeObject<Computer>(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<Computer>(json);
|
||||
JsonObject o = JsonObject.Parse(json);
|
||||
JObject o1 = JObject.Parse(json);
|
||||
Computer o2 = JsonConvert.DeserializeObject<Computer>(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<JsonArray>();
|
||||
}
|
||||
}
|
||||
|
||||
[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<JsonArray>();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -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<JsonReaderException>(
|
||||
() =>
|
||||
{
|
||||
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
|
||||
|
||||
@@ -643,5 +643,18 @@ namespace Newtonsoft.Json.Tests.Linq.JsonPath
|
||||
{
|
||||
ExceptionAssert.Throws<JsonException>(() => { 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
<ProjectTypeGuids>{BC8A1FFA-BEE3-4634-8014-F334798102B3};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||
<PackageCertificateKeyFile>Newtonsoft.Json.Tests.WinRT_TemporaryKey.pfx</PackageCertificateKeyFile>
|
||||
<PackageCertificateThumbprint>3116117C65F73A227A0BDC35F584F04145BA4BB7</PackageCertificateThumbprint>
|
||||
<AppxAutoIncrementPackageRevision>False</AppxAutoIncrementPackageRevision>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
@@ -381,6 +382,7 @@
|
||||
<ItemGroup>
|
||||
<Reference Include="System.Collections.Immutable">
|
||||
<HintPath>..\packages\Microsoft.Bcl.Immutable.1.1.20-beta\lib\portable-net45+win8\System.Collections.Immutable.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' < '12.0' ">
|
||||
|
||||
@@ -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")]
|
||||
|
||||
@@ -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']'"));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -188,7 +188,7 @@ namespace Newtonsoft.Json.Linq
|
||||
IList<JToken> ancestors = Ancestors().Reverse().ToList();
|
||||
ancestors.Add(this);
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
IList<JsonPosition> positions = new List<JsonPosition>();
|
||||
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<JToken>)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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -609,24 +609,17 @@ namespace Newtonsoft.Json.Linq.JsonPath
|
||||
|
||||
private PathFilter ParseQuotedField(char indexerCloseChar)
|
||||
{
|
||||
//_currentIndex++;
|
||||
//int start = _currentIndex;
|
||||
|
||||
List<string> 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);
|
||||
|
||||
@@ -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)]
|
||||
|
||||
Reference in New Issue
Block a user