Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 29 additions & 4 deletions src/JsonDocumentPath.Test/JPathExecuteTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,31 @@ public void GreaterThanWithStringParameterAndIntegerValue()
Assert.Equal(1, results.Count);
}

[Fact]
public void VerifyNameAndValue()
{
string json = @"{
""persons"": [
{
""name"" : ""John"",
""age"": 26
},
{
""name"" : ""Jane"",
""age"": 2
}
]
}";

var models = JsonDocument.Parse(json).RootElement;

var results = models.SelectExtElements("persons[*].name").ToList();

Assert.Equal(2, results.Count);
Assert.Equal("John", results[0].Element.ToString());
Assert.Equal("name", results[0].Name);
}

[Fact]
public void RecursiveWildcard()
{
Expand Down Expand Up @@ -572,7 +597,7 @@ public void EvaluateWildcardIndexOnObjectWithError()
}";
var document = JsonDocument.Parse(json).RootElement;

ExceptionAssert.Throws<JsonException>(() => { document.SelectElement("[*]", true); }, @"Index * not valid on JsonElement.");
ExceptionAssert.Throws<JsonException>(() => { document.SelectElement("[*]", true); }, @"Index * not valid on JsonElementExt.");
}

[Fact]
Expand All @@ -583,7 +608,7 @@ public void EvaluateSliceOnObjectWithError()
}";
var document = JsonDocument.Parse(json).RootElement;

ExceptionAssert.Throws<JsonException>(() => { document.SelectElement("[:]", true); }, @"Array slice is not valid on JsonElement.");
ExceptionAssert.Throws<JsonException>(() => { document.SelectElement("[:]", true); }, @"Array slice is not valid on JsonElementExt.");
}

[Fact]
Expand All @@ -610,7 +635,7 @@ public void EvaluatePropertyOnArrayWithError()
string json = @"[1,2,3,4,5]";
var document = JsonDocument.Parse(json).RootElement;

ExceptionAssert.Throws<JsonException>(() => { document.SelectElement("BlahBlah", true); }, @"Property 'BlahBlah' not valid on JsonElement.");
ExceptionAssert.Throws<JsonException>(() => { document.SelectElement("BlahBlah", true); }, @"Property 'BlahBlah' not valid on JsonElementExt.");
}

[Fact]
Expand Down Expand Up @@ -661,7 +686,7 @@ public void EvaluateMultiPropertyIndexOnArrayWithError()
{
var a = JsonDocument.Parse("[1,2,3,4,5]").RootElement;

ExceptionAssert.Throws<JsonException>(() => { a.SelectElement("['Missing','Missing2']", true); }, "Properties 'Missing', 'Missing2' not valid on JsonElement.");
ExceptionAssert.Throws<JsonException>(() => { a.SelectElement("['Missing','Missing2']", true); }, "Properties 'Missing', 'Missing2' not valid on JsonElementExt.");
}

[Fact]
Expand Down
12 changes: 6 additions & 6 deletions src/JsonDocumentPath/Filters/ArrayIndexFilter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@ internal class ArrayIndexFilter : PathFilter
{
public int? Index { get; set; }

public override IEnumerable<JsonElement?> ExecuteFilter(JsonElement root, IEnumerable<JsonElement?> current, bool errorWhenNoMatch)
public override IEnumerable<JsonElementExt> ExecuteFilter(JsonElement root, IEnumerable<JsonElementExt> current, bool errorWhenNoMatch)
{
foreach (JsonElement t in current)
foreach (JsonElementExt t in current)
{
if (Index != null)
{
JsonElement? v = GetTokenIndex(t, errorWhenNoMatch, Index.GetValueOrDefault());
JsonElementExt v = GetTokenIndex(t.Element.Value, errorWhenNoMatch, Index.GetValueOrDefault());

if (v != null)
{
Expand All @@ -21,11 +21,11 @@ internal class ArrayIndexFilter : PathFilter
}
else
{
if (t.ValueKind == JsonValueKind.Array)
if (t.Element?.ValueKind == JsonValueKind.Array)
{
foreach (JsonElement v in t.EnumerateArray())
foreach (JsonElement v in t.Element.Value.EnumerateArray())
{
yield return v;
yield return new JsonElementExt{ Element = v };
}
}
else
Expand Down
6 changes: 3 additions & 3 deletions src/JsonDocumentPath/Filters/ArrayMultipleIndexFilter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@ public ArrayMultipleIndexFilter(List<int> indexes)
Indexes = indexes;
}

public override IEnumerable<JsonElement?> ExecuteFilter(JsonElement root, IEnumerable<JsonElement?> current, bool errorWhenNoMatch)
public override IEnumerable<JsonElementExt> ExecuteFilter(JsonElement root, IEnumerable<JsonElementExt> current, bool errorWhenNoMatch)
{
foreach (JsonElement t in current)
foreach (JsonElementExt t in current)
{
foreach (int i in Indexes)
{
JsonElement? v = GetTokenIndex(t, errorWhenNoMatch, i);
JsonElementExt v = GetTokenIndex(t.Element.Value, errorWhenNoMatch, i);

if (v != null)
{
Expand Down
10 changes: 5 additions & 5 deletions src/JsonDocumentPath/Filters/ArraySliceFilter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,18 @@ internal class ArraySliceFilter : PathFilter
public int? End { get; set; }
public int? Step { get; set; }

public override IEnumerable<JsonElement?> ExecuteFilter(JsonElement root, IEnumerable<JsonElement?> current, bool errorWhenNoMatch)
public override IEnumerable<JsonElementExt> ExecuteFilter(JsonElement root, IEnumerable<JsonElementExt> current, bool errorWhenNoMatch)
{
if (Step == 0)
{
throw new JsonException("Step cannot be zero.");
}

foreach (JsonElement t in current)
foreach (JsonElementExt t in current)
{
if (t.ValueKind == JsonValueKind.Array)
if (t.Element.Value.ValueKind == JsonValueKind.Array)
{
var aCount = t.GetArrayLength();
var aCount = t.Element.Value.GetArrayLength();
// set defaults for null arguments
int stepCount = Step ?? 1;
int startIndex = Start ?? ((stepCount > 0) ? 0 : aCount - 1);
Expand Down Expand Up @@ -49,7 +49,7 @@ internal class ArraySliceFilter : PathFilter
{
for (int i = startIndex; IsValid(i, stopIndex, positiveStep); i += stepCount)
{
yield return t[i];
yield return new JsonElementExt(){ Element = t.Element.Value[i] };
}
}
else
Expand Down
18 changes: 9 additions & 9 deletions src/JsonDocumentPath/Filters/FieldFilter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,26 +4,26 @@ namespace System.Text.Json
{
internal class FieldFilter : PathFilter
{
internal string? Name;
internal string Name;

public FieldFilter(string? name)
public FieldFilter(string name)
{
Name = name;
}

public override IEnumerable<JsonElement?> ExecuteFilter(JsonElement root, IEnumerable<JsonElement?> current, bool errorWhenNoMatch)
public override IEnumerable<JsonElementExt> ExecuteFilter(JsonElement root, IEnumerable<JsonElementExt> current, bool errorWhenNoMatch)
{
foreach (JsonElement t in current)
foreach (JsonElementExt t in current)
{
if (t.ValueKind == JsonValueKind.Object)
if (t.Element.Value.ValueKind == JsonValueKind.Object)
{
if (Name != null)
{
if (t.TryGetProperty(Name, out JsonElement v))
if (t.Element.Value.TryGetProperty(Name, out JsonElement v))
{
if (v.ValueKind != JsonValueKind.Null)
{
yield return v;
yield return new JsonElementExt(){Element = v, Name =Name };
}
else if (errorWhenNoMatch)
{
Expand All @@ -33,9 +33,9 @@ public FieldFilter(string? name)
}
else
{
foreach (var p in t.ChildrenTokens())
foreach (var p in t.Element.Value.ChildrenTokens())
{
yield return p;
yield return new JsonElementExt() {Element = p};
}
}
}
Expand Down
10 changes: 5 additions & 5 deletions src/JsonDocumentPath/Filters/FieldMultipleFilter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,19 @@ public FieldMultipleFilter(List<string> names)
Names = names;
}

public override IEnumerable<JsonElement?> ExecuteFilter(JsonElement root, IEnumerable<JsonElement?> current, bool errorWhenNoMatch)
public override IEnumerable<JsonElementExt> ExecuteFilter(JsonElement root, IEnumerable<JsonElementExt> current, bool errorWhenNoMatch)
{
foreach (JsonElement t in current)
foreach (JsonElementExt t in current)
{
if (t.ValueKind == JsonValueKind.Object)
if (t.Element.Value.ValueKind == JsonValueKind.Object)
{
foreach (string name in Names)
{
if (t.TryGetProperty(name, out JsonElement v))
if (t.Element.Value.TryGetProperty(name, out JsonElement v))
{
if (v.ValueKind != JsonValueKind.Null)
{
yield return v;
yield return new JsonElementExt(){ Element = v, Name = name };
}
else if (errorWhenNoMatch)
{
Expand Down
16 changes: 8 additions & 8 deletions src/JsonDocumentPath/Filters/QueryFilter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,27 +11,27 @@ public QueryFilter(QueryExpression expression)
Expression = expression;
}

public override IEnumerable<JsonElement?> ExecuteFilter(JsonElement root, IEnumerable<JsonElement?> current, bool errorWhenNoMatch)
public override IEnumerable<JsonElementExt> ExecuteFilter(JsonElement root, IEnumerable<JsonElementExt> current, bool errorWhenNoMatch)
{
foreach (JsonElement el in current)
foreach (JsonElementExt el in current)
{
if (el.ValueKind == JsonValueKind.Array)
if (el.Element.Value.ValueKind == JsonValueKind.Array)
{
foreach (JsonElement v in el.EnumerateArray())
foreach (JsonElement v in el.Element.Value.EnumerateArray())
{
if (Expression.IsMatch(root, v))
{
yield return v;
yield return new JsonElementExt(){ Element = v };
}
}
}
else if (el.ValueKind == JsonValueKind.Object)
else if (el.Element.Value.ValueKind == JsonValueKind.Object)
{
foreach (JsonProperty v in el.EnumerateObject())
foreach (JsonProperty v in el.Element.Value.EnumerateObject())
{
if (Expression.IsMatch(root, v.Value))
{
yield return v.Value;
yield return new JsonElementExt(){ Element = v.Value, Name = v.Name };
}
}
}
Expand Down
10 changes: 5 additions & 5 deletions src/JsonDocumentPath/Filters/QueryScanFilter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,15 @@ public QueryScanFilter(QueryExpression expression)
Expression = expression;
}

public override IEnumerable<JsonElement?> ExecuteFilter(JsonElement root, IEnumerable<JsonElement?> current, bool errorWhenNoMatch)
public override IEnumerable<JsonElementExt> ExecuteFilter(JsonElement root, IEnumerable<JsonElementExt> current, bool errorWhenNoMatch)
{
foreach (JsonElement t in current)
foreach (JsonElementExt t in current)
{
foreach (var (_, Value) in GetNextScanValue(t))
foreach (var (name, v) in GetNextScanValue(t))
{
if (Expression.IsMatch(root, Value))
if (Expression.IsMatch(root, v.Element.Value))
{
yield return Value;
yield return new JsonElementExt(){ Element = v.Element, Name = name };
}
}
}
Expand Down
10 changes: 8 additions & 2 deletions src/JsonDocumentPath/Filters/RootFilter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,15 @@ private RootFilter()
{
}

public override IEnumerable<JsonElement?> ExecuteFilter(JsonElement root, IEnumerable<JsonElement?> current, bool errorWhenNoMatch)
public override IEnumerable<JsonElementExt> ExecuteFilter(JsonElement root, IEnumerable<JsonElementExt> current, bool errorWhenNoMatch)
{
return new JsonElement?[1] { root };
return new List<JsonElementExt>()
{
new JsonElementExt()
{
Element = root
}
};
}
}
}
4 changes: 2 additions & 2 deletions src/JsonDocumentPath/Filters/ScanFilter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ public ScanFilter(string? name)
Name = name;
}

public override IEnumerable<JsonElement?> ExecuteFilter(JsonElement root, IEnumerable<JsonElement?> current, bool errorWhenNoMatch)
public override IEnumerable<JsonElementExt> ExecuteFilter(JsonElement root, IEnumerable<JsonElementExt> current, bool errorWhenNoMatch)
{
foreach (JsonElement c in current)
foreach (JsonElementExt c in current)
{
foreach (var e in GetNextScanValue(c))
{
Expand Down
8 changes: 3 additions & 5 deletions src/JsonDocumentPath/Filters/ScanMultipleFilter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,10 @@ public ScanMultipleFilter(List<string> names)
_names = names;
}

public override IEnumerable<JsonElement?> ExecuteFilter(JsonElement root, IEnumerable<JsonElement?> current, bool errorWhenNoMatch)
public override IEnumerable<JsonElementExt> ExecuteFilter(JsonElement root, IEnumerable<JsonElementExt> current, bool errorWhenNoMatch)
{
foreach (JsonElement c in current)
foreach (JsonElementExt c in current)
{
JsonElement? value = c;

foreach (var e in GetNextScanValue(c))
{
if (e.Name != null)
Expand All @@ -25,7 +23,7 @@ public ScanMultipleFilter(List<string> names)
{
if (e.Name == name)
{
yield return e.Value;
yield return new JsonElementExt(){ Element = e.Value.Element, Name = e.Name };
}
}
}
Expand Down
7 changes: 4 additions & 3 deletions src/JsonDocumentPath/JsonDocumentPath.cs
Original file line number Diff line number Diff line change
Expand Up @@ -897,14 +897,15 @@ private void EnsureLength(string message)
}
}

internal IEnumerable<JsonElement?> Evaluate(JsonElement root, JsonElement t, bool errorWhenNoMatch)
internal IEnumerable<JsonElementExt> Evaluate(JsonElement root, JsonElement t, bool errorWhenNoMatch)
{
return Evaluate(Filters, root, t, errorWhenNoMatch);
}

internal static IEnumerable<JsonElement?> Evaluate(List<PathFilter> filters, JsonElement root, JsonElement t, bool errorWhenNoMatch)
internal static IEnumerable<JsonElementExt> Evaluate(List<PathFilter> filters, JsonElement root, JsonElement t, bool errorWhenNoMatch)
{
IEnumerable<JsonElement?> current = new JsonElement?[] { t };
IEnumerable<JsonElementExt> current = new [] { new JsonElementExt{ Element = t }};

foreach (PathFilter filter in filters)
{
current = filter.ExecuteFilter(root, current, errorWhenNoMatch);
Expand Down
Loading