Как объединить выходные данные цикла For_Each в приложении логики Azure в один плоский массив?
У меня есть For_Each
цикл в приложении логики Azure, которое вызывает другое вложенное приложение логики. Результатом каждой итерации вложенных приложений логики является объект JSON, который содержит массив строк, например:
{
"Results": ["string a", "string b"]
}
Таким образом, вывод из моего цикла For_Each в родительском приложении логики выглядит следующим образом:
[
{"Results": ["string a", "string b"]},
{"Results": ["string c", "string d"]}
]
Я хочу поместить все эти строки в один плоский список, который я могу передать другому действию.
Как я могу это сделать? Возможно ли использовать язык определения рабочего процесса и встроенные функции или мне нужно использовать внешнюю функцию (в службе или функцию Azure)?
4 ответа
Существует более простое решение, работающее с переменными массива. На верхнем уровне, вне цикла For Each, объявите переменную с действием InitializeVariable:
"Initialize_Items_variable": {
"inputs": {
"variables": [
{
"name": "Items",
"type": "Array",
"value": []
}
]
},
"runAfter": {},
"type": "InitializeVariable"
}
Внутри For Each используйте действие AppendToArray Variable. Вы можете добавить объект Response только что вызванного приложения Nested Logic.
"Append_to_Items_variable": {
"inputs": {
"name": "Items",
"value": "@body('Nested_Logic_App_Response')"
},
"runAfter": {
},
"type": "AppendToArrayVariable"
}
Надеюсь, поможет.
Этот метод работает довольно хорошо и использует только стандартные действия приложения логики:
- 1. начните с объявления пустой переменной массива (переменная действия : инициализировать переменную)
- 2. итерация по вашим элементам (управление действием : для каждого), например, набор результатов из предыдущего действия
- на каждой итерации сначала составляйте нужный фрагмент JSON (действие Операции с данными: Составить)
- затем добавьте результат действия Compose в массив (действие: Variable: Добавить в переменную массива)
- 3. затем, вне цикла, соедините элементы массива (действие Data Operations: Join)
- 4. сделайте то, что вам нужно, с выводом действия Join, например, отправьте как полезную нагрузку ответа (действие Request: Response)
Вот как это выглядит в итоге:
Есть также способ сделать это, используя язык определения рабочего процесса. ( 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 может быть легче перечитать позже, но может быть много причин не хотеть создавать новую функцию Azure, пока вы можете выполнять эту работу в приложении логики.
Не стесняйтесь спрашивать более подробную информацию, если это необходимо:)
Принимая во внимание полезный комментарий @DerekLi выше, кажется, что это невозможно во время написания версии схемы приложений логики. 2016-06-01
,
Одной из сильных сторон приложений логики является возможность использовать возможности функций Azure для решения таких проблем, которые (пока) не могут быть решены на языке схемы.
Переписать массив тривиально в 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"
}
Вы можете использовать @body(nestedLogicApp) вне цикла for-each, чтобы получить доступ ко всем ответам вложенных приложений логики в массиве.