From 14c0428df7e4e40b196b9ce731b05a1205f38808 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Sat, 6 Feb 2016 11:19:17 +1300 Subject: [PATCH] -Fixed JSONPath queries combining wildcard with property search --- .../Linq/JsonPath/JPathExecuteTests.cs | 46 +++++++++++++++++++ Src/Newtonsoft.Json/Linq/JsonPath/JPath.cs | 13 ++++-- 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/Src/Newtonsoft.Json.Tests/Linq/JsonPath/JPathExecuteTests.cs b/Src/Newtonsoft.Json.Tests/Linq/JsonPath/JPathExecuteTests.cs index 19da08e0..49f473d0 100644 --- a/Src/Newtonsoft.Json.Tests/Linq/JsonPath/JPathExecuteTests.cs +++ b/Src/Newtonsoft.Json.Tests/Linq/JsonPath/JPathExecuteTests.cs @@ -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 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() { diff --git a/Src/Newtonsoft.Json/Linq/JsonPath/JPath.cs b/Src/Newtonsoft.Json/Linq/JsonPath/JPath.cs index b0e02422..a8346a14 100644 --- a/Src/Newtonsoft.Json/Linq/JsonPath/JPath.cs +++ b/Src/Newtonsoft.Json/Linq/JsonPath/JPath.cs @@ -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