-Fixed JSONPath queries combining wildcard with property search

This commit is contained in:
James Newton-King
2016-02-06 11:19:17 +13:00
parent b3edfbdc01
commit 14c0428df7
2 changed files with 55 additions and 4 deletions
@@ -740,6 +740,52 @@ namespace Newtonsoft.Json.Tests.Linq.JsonPath
Assert.AreEqual(1L, v.Value);
}
[Test]
public void WildcardWithProperty()
{
JObject o = JObject.Parse(@"{
""station"": 92000041000001,
""containers"": [
{
""id"": 1,
""text"": ""Sort system"",
""containers"": [
{
""id"": ""2"",
""text"": ""Yard 11""
},
{
""id"": ""92000020100006"",
""text"": ""Sort yard 12""
},
{
""id"": ""92000020100005"",
""text"": ""Yard 13""
}
]
},
{
""id"": ""92000020100011"",
""text"": ""TSP-1""
},
{
""id"":""92000020100007"",
""text"": ""Passenger 15""
}
]
}");
IList<JToken> tokens = o.SelectTokens("$..*[?(@.text)]").ToList();
int i = 0;
Assert.AreEqual("Sort system", (string)tokens[i++]["text"]);
Assert.AreEqual("TSP-1", (string)tokens[i++]["text"]);
Assert.AreEqual("Passenger 15", (string)tokens[i++]["text"]);
Assert.AreEqual("Yard 11", (string)tokens[i++]["text"]);
Assert.AreEqual("Sort yard 12", (string)tokens[i++]["text"]);
Assert.AreEqual("Yard 13", (string)tokens[i++]["text"]);
Assert.AreEqual(6, tokens.Count);
}
[Test]
public void QueryAgainstNonStringValues()
{
+9 -4
View File
@@ -106,7 +106,12 @@ namespace Newtonsoft.Json.Linq.JsonPath
if (_currentIndex > currentPartStartIndex)
{
string member = _expression.Substring(currentPartStartIndex, _currentIndex - currentPartStartIndex);
PathFilter filter = (scan) ? (PathFilter)new ScanFilter() { Name = member } : new FieldFilter() { Name = member };
if (member == "*")
{
member = null;
}
PathFilter filter = (scan) ? (PathFilter)new ScanFilter { Name = member } : new FieldFilter { Name = member };
filters.Add(filter);
scan = false;
}
@@ -122,7 +127,6 @@ namespace Newtonsoft.Json.Linq.JsonPath
ended = true;
break;
case ' ':
//EatWhitespace();
if (_currentIndex < _expression.Length)
{
ended = true;
@@ -136,7 +140,8 @@ namespace Newtonsoft.Json.Linq.JsonPath
{
member = null;
}
PathFilter filter = (scan) ? (PathFilter)new ScanFilter() { Name = member } : new FieldFilter() { Name = member };
PathFilter filter = (scan) ? (PathFilter)new ScanFilter { Name = member } : new FieldFilter { Name = member };
filters.Add(filter);
scan = false;
}
@@ -177,7 +182,7 @@ namespace Newtonsoft.Json.Linq.JsonPath
{
member = null;
}
PathFilter filter = (scan) ? (PathFilter)new ScanFilter() { Name = member } : new FieldFilter() { Name = member };
PathFilter filter = (scan) ? (PathFilter)new ScanFilter { Name = member } : new FieldFilter { Name = member };
filters.Add(filter);
}
else