diff --git a/JUST.net/JsonTransformer.cs b/JUST.net/JsonTransformer.cs index 3a97c6f..a2be650 100644 --- a/JUST.net/JsonTransformer.cs +++ b/JUST.net/JsonTransformer.cs @@ -477,7 +477,6 @@ private void LoopOperation(string propertyName, string arguments, State state, r if (args.Length > 2) { previousAlias = (string)ParseFunction(args[2].Trim(), state); - state.CurrentArrayToken.Add(new LevelKey() { Key = previousAlias, Level = _levelCounter }, Context.Input); } else if (state.CurrentArrayToken.Any(t => t.Key.Key == alias)) { diff --git a/UnitTests/Arrays/LoopingTests.cs b/UnitTests/Arrays/LoopingTests.cs index 65ec48e..a58ace3 100644 --- a/UnitTests/Arrays/LoopingTests.cs +++ b/UnitTests/Arrays/LoopingTests.cs @@ -248,7 +248,17 @@ public void SingleIndexReference() } [Test] - public void LoopingAlias() + public void SingleLoopingAlias() + { + const string transformer = "{ \"hello\": { \"#loop($.NestedLoop.Organization.Employee, employee, root)\": { \"Name\": \"#currentvalueatpath($.Name)\", \"NameExplicit\": \"#currentvalueatpath($.Name, employee)\" } } }"; + + var result = new JsonTransformer(new JUSTContext() { EvaluationMode = EvaluationMode.Strict }).Transform(transformer, ExampleInputs.NestedArrays); + + Assert.AreEqual("{\"hello\":[{\"Name\":\"E2\",\"NameExplicit\":\"E2\"},{\"Name\":\"E1\",\"NameExplicit\":\"E1\"}]}", result); + } + + [Test] + public void MultipleLoopingAlias() { const string transformer = "{ \"hello\": { \"#loop($.NestedLoop.Organization.Employee, employee)\": { \"Details\": { \"#loop($.Details, details)\": { \"CurrentCountry\": \"#currentvalueatpath($.Country, details)\", \"OuterName\": \"#currentvalueatpath($.Name, employee)\", \"FirstLevel\": { \"#loop($.Roles, roles)\": { \"Employee\": \"#currentvalue(employee)\", \"Job\": \"#currentvalueatpath($.Job, roles)\" } } } } } } }"; @@ -267,6 +277,18 @@ public void MixedLoopingAlias() Assert.AreEqual("{\"hello\":[{\"Details\":[{\"CurrentCountry\":\"Iceland\",\"OuterName\":\"E2\"}]},{\"Details\":[{\"CurrentCountry\":\"Denmark\",\"OuterName\":\"E1\"}]}]}", result); } + [Test] + public void NestedLoopingAlias() + { + const string transformer = "{ \"payload\": { \"produce-color\": { \"green\": { \"#loop($..fruit[?(@.color == 'green')], outside-loop)\": { \"name\": \"#currentvalueatpath($.name)\", \"outer-index\": \"#currentindex()\", \"other\": { \"#loop($..vegetables[?(@.color == 'green')],inner-loop,root)\": { \"name\": \"#currentvalueatpath($.name)\", \"inner-index\": \"#currentindex()\" } }, \"addionalInformation\": { \"outside-name\": \"#currentvalueatpath($.name)\" } } } } }}"; + const string input = "{ \"root\": { \"type\": \"produce\", \"vegetables\": [ { \"name\": \"tomato\", \"color\": \"red\" }, { \"name\": \"cucumber\", \"color\": \"green\" }, { \"name\": \"bell-pepper\", \"color\": \"yellow\" }, { \"name\": \"colored-greens\", \"color\": \"green\" } ], \"fruit\": [ { \"name\": \"banana\", \"color\": \"yellow\" }, { \"name\": \"melon\", \"color\": \"green\" }, { \"name\": \"orange\", \"color\": \"orange\" }, { \"name\": \"apple\", \"color\": \"green\" }, { \"name\": \"pear\", \"color\": \"green\" } ] }}"; + + var context = new JUSTContext() { EvaluationMode = EvaluationMode.Strict }; + var result = new JsonTransformer(context).Transform(transformer, input); + + Assert.AreEqual("{\"payload\":{\"produce-color\":{\"green\":[{\"name\":\"melon\",\"outer-index\":0,\"other\":[{\"name\":\"cucumber\",\"inner-index\":0},{\"name\":\"colored-greens\",\"inner-index\":1}],\"addionalInformation\":{\"outside-name\":\"melon\"}},{\"name\":\"apple\",\"outer-index\":1,\"other\":[{\"name\":\"cucumber\",\"inner-index\":0},{\"name\":\"colored-greens\",\"inner-index\":1}],\"addionalInformation\":{\"outside-name\":\"apple\"}},{\"name\":\"pear\",\"outer-index\":2,\"other\":[{\"name\":\"cucumber\",\"inner-index\":0},{\"name\":\"colored-greens\",\"inner-index\":1}],\"addionalInformation\":{\"outside-name\":\"pear\"}}]}}}", result); + } + [Test] public void BulkFunctions() {