From c5fc58d18c4f1a1d83914da8a27887250c1bf076 Mon Sep 17 00:00:00 2001 From: "TRUPHONE\\Nuno.Courela" Date: Sat, 4 Jun 2022 18:47:55 +0100 Subject: [PATCH] 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); + } } }