如何将 Azure 逻辑应用程序中 For_Each 循环的输出合并到单个平面数组?
How can I merge the outputs from a For_Each loop in an Azure Logic App to a single flat array?
我在调用另一个嵌套逻辑应用程序的 Azure 逻辑应用程序中有一个 For_Each
循环。嵌套逻辑应用程序每次迭代的结果是一个包含字符串数组的 JSON 对象,如下所示:
{
"Results": ["string a", "string b"]
}
所以我的 For_Each 循环在父逻辑应用程序中的输出如下所示:
[
{"Results": ["string a", "string b"]},
{"Results": ["string c", "string d"]}
]
我想将所有这些字符串放入一个平面列表中,我可以将其传递给另一个操作。
我该怎么做?是否可以使用工作流定义语言和内置函数,或者我是否需要使用外部函数(在服务或 Azure 函数中)?
参考上面@DerekLi 的有用评论,在使用逻辑应用架构版本 2016-06-01
.
编写时,这似乎是不可能的
Logic Apps 的一大优势是能够利用 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"
}
还有一种方法可以使用工作流定义语言来实现。 (https://docs.microsoft.com/en-us/azure/logic-apps/logic-apps-workflow-definition-language).
使用函数 string
和 replace
您可以将 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":[
替换为 ,
。
我们将所有的}]
替换为}
。
我们将所有的[{
替换为{
。
我们得到字符串{"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 中完成该工作.
如有需要,请随时询问更多详情:)
您可以在 for-each 循环之外使用 @body(nestedLogicApp) 来访问数组中所有嵌套逻辑应用程序的响应。
有一个更简单的解决方案,使用数组变量。
在顶层,在 For Each 循环之外,使用 InitializeVariable 操作声明一个变量:
"Initialize_Items_variable": {
"inputs": {
"variables": [
{
"name": "Items",
"type": "Array",
"value": []
}
]
},
"runAfter": {},
"type": "InitializeVariable"
}
在 For Each 中,使用 AppendToArrayVariable 操作。您可以附加刚刚调用的 Nested Logic App 的 Response 对象。
"Append_to_Items_variable": {
"inputs": {
"name": "Items",
"value": "@body('Nested_Logic_App_Response')"
},
"runAfter": {
},
"type": "AppendToArrayVariable"
}
希望对您有所帮助。
这项技术效果很好,并且只使用 运行-of-the-mill Logic App 操作:
1。首先声明一个空数组变量 (action Variable: Initialise variable)
2。遍历您的项目(操作 控制:对于每个),例如先前操作的结果集
- 在每次迭代中,首先组合你需要的JSON片段(操作数据操作:组合)
- 然后将 Compose 操作的输出附加到数组(操作:变量:附加到数组变量)
3。然后,在循环外,连接数组的元素(操作数据操作:连接)
4。使用 Join 操作的输出执行您需要的操作,例如作为响应负载发送(操作 请求:响应)
最后是这样的:
我在调用另一个嵌套逻辑应用程序的 Azure 逻辑应用程序中有一个 For_Each
循环。嵌套逻辑应用程序每次迭代的结果是一个包含字符串数组的 JSON 对象,如下所示:
{
"Results": ["string a", "string b"]
}
所以我的 For_Each 循环在父逻辑应用程序中的输出如下所示:
[
{"Results": ["string a", "string b"]},
{"Results": ["string c", "string d"]}
]
我想将所有这些字符串放入一个平面列表中,我可以将其传递给另一个操作。
我该怎么做?是否可以使用工作流定义语言和内置函数,或者我是否需要使用外部函数(在服务或 Azure 函数中)?
参考上面@DerekLi 的有用评论,在使用逻辑应用架构版本 2016-06-01
.
Logic Apps 的一大优势是能够利用 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"
}
还有一种方法可以使用工作流定义语言来实现。 (https://docs.microsoft.com/en-us/azure/logic-apps/logic-apps-workflow-definition-language).
使用函数 string
和 replace
您可以将 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":[
替换为 ,
。
我们将所有的}]
替换为}
。
我们将所有的[{
替换为{
。
我们得到字符串{"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 中完成该工作.
如有需要,请随时询问更多详情:)
您可以在 for-each 循环之外使用 @body(nestedLogicApp) 来访问数组中所有嵌套逻辑应用程序的响应。
有一个更简单的解决方案,使用数组变量。 在顶层,在 For Each 循环之外,使用 InitializeVariable 操作声明一个变量:
"Initialize_Items_variable": {
"inputs": {
"variables": [
{
"name": "Items",
"type": "Array",
"value": []
}
]
},
"runAfter": {},
"type": "InitializeVariable"
}
在 For Each 中,使用 AppendToArrayVariable 操作。您可以附加刚刚调用的 Nested Logic App 的 Response 对象。
"Append_to_Items_variable": {
"inputs": {
"name": "Items",
"value": "@body('Nested_Logic_App_Response')"
},
"runAfter": {
},
"type": "AppendToArrayVariable"
}
希望对您有所帮助。
这项技术效果很好,并且只使用 运行-of-the-mill Logic App 操作:
- 1。首先声明一个空数组变量 (action Variable: Initialise variable)
- 2。遍历您的项目(操作 控制:对于每个),例如先前操作的结果集
- 在每次迭代中,首先组合你需要的JSON片段(操作数据操作:组合)
- 然后将 Compose 操作的输出附加到数组(操作:变量:附加到数组变量)
- 3。然后,在循环外,连接数组的元素(操作数据操作:连接)
- 4。使用 Join 操作的输出执行您需要的操作,例如作为响应负载发送(操作 请求:响应)
最后是这样的: