From c5fc58d18c4f1a1d83914da8a27887250c1bf076 Mon Sep 17 00:00:00 2001 From: "TRUPHONE\\Nuno.Courela" Date: Sat, 4 Jun 2022 18:47:55 +0100 Subject: [PATCH 1/2] Item form array with another array inside a conditional function; replace foreach with for when looping over child tokens, to avoid Collection was modified exception --- JUST.net/JsonTransformer.cs | 19 +++++++++++++++++-- UnitTests/ConditionalFunctionsTests.cs | 11 +++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/JUST.net/JsonTransformer.cs b/JUST.net/JsonTransformer.cs index 5fe4344..c37e9ed 100644 --- a/JUST.net/JsonTransformer.cs +++ b/JUST.net/JsonTransformer.cs @@ -137,8 +137,9 @@ private void RecursiveEvaluate(ref JToken parentToken, IDictionary tokenToF } else if (token is JArray arr && parentToken.Parent != null) { - (parentToken.Parent as JProperty).Value = arr; + switch (parentToken.Parent.Type) + { + case JTokenType.Array: + parentToken.Replace(arr); + break; + case JTokenType.Property: + (parentToken.Parent as JProperty).Value = arr; + break; + default: + if (Context.IsStrictMode()) + { + throw new Exception($"don't know what to do with {token} and {parentToken.Type} parent!"); + } + break; + } } else { diff --git a/UnitTests/ConditionalFunctionsTests.cs b/UnitTests/ConditionalFunctionsTests.cs index fccd194..19b2750 100644 --- a/UnitTests/ConditionalFunctionsTests.cs +++ b/UnitTests/ConditionalFunctionsTests.cs @@ -234,5 +234,16 @@ public void ConditionalGroupNonExistingWithLoopInside() Assert.AreEqual("{\"Result\":{},\"Other\":\"property\"}", result); } + + [Test] + public void ConditionalGroupOnArrayItemWithLoopInside() + { + const string input = "{ \"additional_content\": [{ \"Cards_feed\": { \"cards_feed\": [ \"2\"] } }] }"; + const string transformer = "{ \"content\": [ { \"aaa\": \"bbb\" }, { \"#ifgroup(#exists($.additional_content[*].Cards_feed))\": { \"#loop($.additional_content[*].Cards_feed.cards_feed)\": { \"xxx\": \"yyy\" } } } ] }"; + + var result = new JsonTransformer(new JUSTContext { EvaluationMode = EvaluationMode.Strict }).Transform(transformer, input); + + Assert.AreEqual("{\"content\":[{\"aaa\":\"bbb\"},[{\"xxx\":\"yyy\"}]]}", result); + } } } From fc3cf5b68a9cb1fda98ffd5949f89fae3e583a44 Mon Sep 17 00:00:00 2001 From: Courela Date: Sat, 2 Dec 2023 10:05:32 +0000 Subject: [PATCH 2/2] #minatpath returns decimal.MaxValue if no valid number found --- JUST.net/Transformer.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/JUST.net/Transformer.cs b/JUST.net/Transformer.cs index d2c724b..9469fd5 100644 --- a/JUST.net/Transformer.cs +++ b/JUST.net/Transformer.cs @@ -451,7 +451,7 @@ private static object Min(JToken token, JUSTContext context) public static object minatpath(JArray parsedArray, string path, JUSTContext context) { - decimal result = 0; + decimal? result = null; if (parsedArray != null) { @@ -461,12 +461,12 @@ public static object minatpath(JArray parsedArray, string path, JUSTContext cont if (selector.Select(path) is JToken selectedToken) { decimal thisValue = Convert.ToDecimal(selectedToken.ToString()); - result = Math.Min(result, thisValue); + result = Math.Min(result ?? decimal.MaxValue, thisValue); } } } - return TypedNumber(result); + return TypedNumber(result ?? decimal.MaxValue); } public static int arraylength(string array, JUSTContext context)