7

For_Each在 Azure 逻辑应用程序中有一个循环,它调用另一个嵌套的逻辑应用程序。嵌套逻辑应用每次迭代的结果是一个 JSON 对象,其中包含一个字符串数组,如下所示:

{
 "Results": ["string a", "string b"]
}

因此,父逻辑应用中的 For_Each 循环的输出如下所示:

[
 {"Results": ["string a", "string b"]},
 {"Results": ["string c", "string d"]}
]

我想将所有这些字符串放入一个可以传递给另一个操作的平面列表中。

我怎样才能做到这一点?是否可以使用工作流定义语言和内置函数,或者我是否需要使用外部函数(在服务中或 Azure 函数中)?

4

5 回答 5

8

There's a simpler solution, working with Array Variables. At the top level, outside the For Each loop, declare a variable with an InitializeVariable action:

"Initialize_Items_variable": {
    "inputs": {
        "variables": [
            {
                "name": "Items",
                "type": "Array",
                "value": []
            }
        ]
    },
    "runAfter": {},
    "type": "InitializeVariable"
}

Inside the For Each, use a AppendToArrayVariable action. You can append the Response object of the Nested Logic App you just called.

"Append_to_Items_variable": {
    "inputs": {
        "name": "Items",
        "value": "@body('Nested_Logic_App_Response')"
    },
    "runAfter": {
    },
    "type": "AppendToArrayVariable"
}

Hope it helps.

于 2017-12-12T00:00:41.027 回答
1

还有一种使用工作流定义语言的方法。(https://docs.microsoft.com/en-us/azure/logic-apps/logic-apps-workflow-definition-language)。

使用函数stringreplace您可以将 json 作为字符串而不是对象处理。

以下是对您的数据执行操作Flat_List之后的操作:Parse_JSON

您的数据:

[
 {"Results": ["string a", "string b"]},
 {"Results": ["string c", "string d"]}
]

Flat_List 组件:

 "Flat_List": {
            "inputs": "@replace(replace(replace(string(body('Parse_JSON')),']},{\"Results\":[',','),'}]','}'),'[{','{')",
            "runAfter": {
                "Parse_JSON": [
                    "Succeeded"
                ]
            },
            "type": "Compose"
        },

这里会发生什么?首先,我们使用string它获取您的 json 数据并给出:

[{"Results":["string a", "string b"]},{"Results":["string c", "string d"]}]

我们替换所有的]},{"Results":[by ,

我们替换所有的}]by }

我们替换所有的[{by {

我们得到字符串{"Results":["string a","string b","string c","string d"]}

然后,您可以自由地将其解析回 json:

"Parse_JSON_2": {
                "inputs": {
                    "content": "@outputs('Flat_List')",
                    "schema": {
                        "properties": {
                            "Results": {
                                "items": {
                                    "type": "string"
                                },
                                "type": "array"
                            }
                        },
                        "type": "object"
                    }
                },
                "runAfter": {
                    "Flat_List": [
                        "Succeeded"
                    ]
                },
                "type": "ParseJson"
            }

您可以将其视为概念证明,因为 Azure Function 以后可能更容易重新阅读,但可能有很多理由不想实例化新的 Azure Function,而您可以在 Logic App 中完成这项工作。

如果需要,请随时询问更多详细信息:)

于 2017-05-11T14:37:00.067 回答
1

这种技术效果很好,并且只使用普通的 Logic App 操作:

    1.从声明一个空数组变量开始(动作变量:初始化变量
    2. 遍历您的项目(动作控制:对于每个),例如前一个动作的结果集
    • 在每次迭代中,首先编写您需要的 JSON 片段(动作数据操作:编写
    • 然后将 Compose 操作的输出附加到数组(操作:变量:附加到数组变量
    3.然后,在循环之外,加入数组的元素(动作数据操作:加入
    4. 使用 Join 动作的输出做你需要的事情,例如作为响应负载发送(动作请求:响应

这就是它最终的样子:

逻辑应用设计器屏幕截图

于 2020-05-29T17:22:37.287 回答
1

在上面提到@DerekLi 的有用评论时,似乎在编写 Logic Apps schema version 时这是不可能的2016-06-01

逻辑应用的一大优势是能够利用 Azure Functions 的强大功能来解决此类(尚)无法在架构语言中解决的问题。

在 c# 函数中重写数组是微不足道的:

using System.Net;

public class Result
{
    public List<string> Results {get; set;}
}

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
    log.Info("C# HTTP trigger function processed a request.");

    var inputs = await req.Content.ReadAsAsync<List<Result>>();
    var outputs = new List<string>();

    foreach(var item in inputs)
    {
        log.Info(item.Results.ToString());
        outputs.AddRange(item.Results.Where(x => !string.IsNullOrEmpty(x)));
    }

    return req.CreateResponse(HttpStatusCode.OK, outputs);
}

然后可以将此函数传递给For_Each循环的结果:

"MyFunction": {
    "inputs": {
                "body": "@body('Parse_JSON')",
                "function": {
                    "id": "/subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/Microsoft.Web/sites/{function-app-name}/functions/{function-name}"
                },
                "method": "POST"
            },
            "runAfter": {
                "For_each": [
                    "Succeeded"
                ]
            },
            "type": "Function"
}
于 2017-05-10T07:50:45.227 回答
0

您可以在 for-each 循环之外使用 @body(nestedLogicApp) 来访问数组中所有嵌套逻辑应用的响应。

于 2017-05-11T17:34:34.340 回答