У меня есть образец полезных данных, который я получаю от сторонней конечной точки. Используя Logic Apps, я хочу вернуть подмножество этих данных. Вот как выглядит моя сторонняя полезная нагрузка
{
"SearchSummary": {
"TotalRecordsFound": 48,
"Offset": 0,
"RecordsReturned": 48,
"DatabaseInfo": {
"ReleaseNumber": "43",
"UpdateNumber": "431",
"UpdateDate": "2024-08-20T00:00:00",
"VersionNumber": "129.00",
"IndexationDate": null
},
"Sort": null
},
"Data": [
{
"birthdate": "1950-06-01T00:00:00",
"firstName": "Ian",
"middleName": "Charlie",
"lastName": "Jones",
"dirId": "P003577888",
"MEMBERSHIP_DATA": [
{
"companyId": null,
"companyName": null,
"startDate": null,
"status": null,
"endDate": null,
"title": null,
"dept": null
}
]
},
{
"birthdate": "1919-05-11T00:00:00",
"firstName": "Dorothy",
"middleName": "June",
"lastName": "Perkins",
"dirId": "P003890700",
"MEMBERSHIP_DATA": [
{
"companyId": null,
"companyName": null,
"startDate": null,
"status": null,
"endDate": null,
"title": null,
"dept": null
}
]
},
{
"birthdate": "1947-11-09T00:00:00",
"firstName": "Paul",
"middleName": "Dean",
"lastName": "Doe",
"dirId": "P003890600",
"MEMBERSHIP_DATA": [
{
"companyId": "GB04969800",
"companyName": "Acme Ltd 1",
"startDate": "2020-04-15T00:00:00",
"status": "Previous",
"endDate": "2021-04-15T00:00:00",
"title": "Director",
"dept": "Board of Directors; Senior management"
},
{
"companyId": "GB07346800",
"companyName": "Acme Ltd 2",
"startDate": "2010-08-16T00:00:00",
"status": "Current",
"endDate": null,
"title": "Director",
"dept": "Board of Directors; Senior management"
}
]
}
]
}
В моем приложении логики я хочу запросить это, а затем вернуть только массив «Данные». В дополнение к этому я хочу фильтровать любые наши объекты MEMBERSHIP_DATA, если MEMBERSHIP_DATA.Status = Previous.
Так, например, из моего образца полезных данных выше первая запись о членстве Пола Доу должна быть удалена в моем возвращенном ответе. Вот как выглядит мое определение приложения логики
{
"definition": {
"$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
"actions": {
"Create_CompanyContact_Array": {
"inputs": {
"variables": [
{
"name": "CompanyContacts",
"type": "array",
"value": "@body('Parse_JSON')?['Data']"
}
]
},
"runAfter": {
"Parse_JSON": [
"SUCCEEDED"
]
},
"type": "InitializeVariable"
},
"HTTP": {
"inputs": {
"headers": {
"ApiToken": "XXX"
},
"method": "GET",
"uri": "https://companytest.free.beeceptor.com/contact"
},
"runAfter": {},
"type": "Http"
},
"Loop_Contacts": {
"actions": {
"Loop_Membership": {
"actions": {
"Filter_array": {
"inputs": {
"from": "@items('Loop_Contacts')?['MEMBERSHIP_DATA']",
"where": "@equals(items('Loop_Membership')['Status'],'Current')"
},
"type": "Query"
}
},
"foreach": "@items('Loop_Contacts')?['MEMBERSHIP_DATA']",
"type": "foreach"
}
},
"foreach": "@variables('CompanyContacts')",
"runAfter": {
"Create_CompanyContacts_Array": [
"SUCCEEDED"
]
},
"type": "foreach"
},
"Parse_JSON": {
"inputs": {
"content": "@body('HTTP')",
"schema": {
"properties": {
"Data": {
"items": {
"properties": {
"MEMBERSHIP_DATA": {
"items": {
"properties": {
"companyId": {
"type": [
"string",
"null"
]
},
"companyName": {
"type": [
"string",
"null"
]
},
"dept": {
"type": [
"string",
"null"
]
},
"endDate": {
"type": [
"string",
"null"
]
},
"startDate": {
"type": [
"string",
"null"
]
},
"status": {
"type": [
"string",
"null"
]
},
"title": {
"type": [
"string",
"null"
]
}
},
"type": "object"
},
"type": "array"
},
"birthdate": {
"type": [
"string",
"null"
]
},
"dirId": {
"type": [
"string",
"null"
]
},
"firstName": {
"type": [
"string",
"null"
]
},
"lastName": {
"type": [
"string",
"null"
]
},
"middleName": {
"type": [
"string",
"null"
]
}
},
"type": "object"
},
"type": "array"
},
"SearchSummary": {
"properties": {
"DatabaseInfo": {
"properties": {
"IndexationDate": {},
"ReleaseNumber": {
"type": "string"
},
"UpdateDate": {
"type": "string"
},
"UpdateNumber": {
"type": "string"
},
"VersionNumber": {
"type": "string"
}
},
"type": "object"
},
"Offset": {
"type": "integer"
},
"RecordsReturned": {
"type": "integer"
},
"Sort": {},
"TotalRecordsFound": {
"type": "integer"
}
},
"type": "object"
}
},
"type": "object"
}
},
"runAfter": {
"HTTP": [
"SUCCEEDED"
]
},
"type": "ParseJson"
},
"Response": {
"inputs": {
"body": "@variables('CompanyContacts')",
"statusCode": "@outputs('HTTP')?['statusCode']"
},
"kind": "Http",
"runAfter": {
"Loop_Contacts": [
"SUCCEEDED"
]
},
"type": "Response"
}
},
"contentVersion": "1.0.0.0",
"outputs": {},
"triggers": {
"When_a_HTTP_request_is_received": {
"kind": "Http",
"type": "Request"
}
}
},
"kind": "Stateless"
}
Приложение возвращает объект Data, но не фильтрует, как описано выше, и возвращает все строки MEMBERSHIP_DATA. Может ли кто-нибудь объяснить, что я делаю неправильно?
@RithwikBojja Нет, это стандартное приложение логики, поэтому вам не нужна учетная запись интеграции для выполнения кода JavaScript.
Ох, ладно @10p


В моем приложении логики я хочу запросить это, а затем вернуть только массив «Данные». В дополнение к этому я хочу фильтровать любые наши объекты
MEMBERSHIP_DATA, еслиMEMBERSHIP_DATA.Status = Previous.
Вы можете использовать для этого дизайн ниже:

В Compose я сохранил ваши данные.
Затем:

Схема Parse_Json:
{
"type": "object",
"properties": {
"SearchSummary": {
"type": "object",
"properties": {
"TotalRecordsFound": {
"type": "integer"
},
"Offset": {
"type": "integer"
},
"RecordsReturned": {
"type": "integer"
},
"DatabaseInfo": {
"type": "object",
"properties": {
"ReleaseNumber": {
"type": "string"
},
"UpdateNumber": {
"type": "string"
},
"UpdateDate": {
"type": "string"
},
"VersionNumber": {
"type": "string"
},
"IndexationDate": {}
}
},
"Sort": {}
}
},
"Data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"birthdate": {
"type": "string"
},
"firstName": {
"type": "string"
},
"middleName": {
"type": "string"
},
"lastName": {
"type": "string"
},
"dirId": {
"type": "string"
},
"MEMBERSHIP_DATA": {
"type": "array",
"items": {
"type": "object",
"properties": {
"companyId": {},
"companyName": {},
"startDate": {},
"status": {},
"endDate": {},
"title": {},
"dept": {}
},
"required": [
"companyId",
"companyName",
"startDate",
"status",
"endDate",
"title",
"dept"
]
}
}
},
"required": [
"birthdate",
"firstName",
"middleName",
"lastName",
"dirId",
"MEMBERSHIP_DATA"
]
}
}
}
}
затем следующие действия:

Выход:


Если вы не хотите иметь дело с несколькими действиями For_each, самый простой способ отфильтровать массив данных, оставив только элементы MEMBERSHIP_DATA со статусом = «Предыдущий», — это использовать действие Выполнить код JavaScript следующим образом:
const data = workflowContext.actions.Parse_JSON.outputs.body.Data
const filteredData = data.map(function(item) {
var newItem = Object.assign({}, item);
newItem.MEMBERSHIP_DATA = item.MEMBERSHIP_DATA.filter(item => item.status === "Previous");
return newItem;
});
return filteredData
Результат:
[
{
"MEMBERSHIP_DATA": [],
"birthdate": "1950-06-01T00:00:00",
"dirId": "P003577888",
"firstName": "Ian",
"lastName": "Jones",
"middleName": "Charlie"
},
{
"MEMBERSHIP_DATA": [],
"birthdate": "1919-05-11T00:00:00",
"dirId": "P003890700",
"firstName": "Dorothy",
"lastName": "Perkins",
"middleName": "June"
},
{
"MEMBERSHIP_DATA": [
{
"companyId": "GB04969800",
"companyName": "Acme Ltd 1",
"dept": "Board of Directors; Senior management",
"endDate": "2021-04-15T00:00:00",
"startDate": "2020-04-15T00:00:00",
"status": "Previous",
"title": "Director"
}
],
"birthdate": "1947-11-09T00:00:00",
"dirId": "P003890600",
"firstName": "Paul",
"lastName": "Doe",
"middleName": "Dean"
}
]
Если результат не соответствует вашим ожиданиям, вы можете соответствующим образом скорректировать код JavaScript.
В приведенном примере результаты не фильтруются. Я подтвердил, что элементы используют одни и те же имена.
@InvalidSyntax, я проверил код, прежде чем опубликовать ответ. Это полный код рабочего процесса, который я использовал для тестирования: coderstool.com/cs/C3aPB4
Хорошо, я только что протестировал тот же рабочий процесс, который вы создали, он работает. Дело в том, что мой ответ возвращает исходное тело Parse_JSON вместо вывода JS. Возможно ли, чтобы я мог перебрать CompanyContacts и сохранить изменения непосредственно в этой переменной?
@InvalidSyntax Требование в вашем вопросе заключалось в том, чтобы приложение логики возвращало подмножество массива «Данные», полученное из сторонней конечной точки. Код JavaScript достигает этого. Вы можете изменить ответ приложения логики, чтобы он возвращал выходные данные JavaScript вместо тела Parse_JSON. Повторение CompanyContacts кажется ненужным. Учитывая ваше знакомство с JavaScript, вы можете при необходимости настроить код/выходные данные.
Чтобы ответить на ваш вопрос о сохранении изменений непосредственно в переменной: да, вы можете использовать действие Set variable: Learn.microsoft.com/en-us/azure/logic-apps/…
Но для выполнения сценария Java вам необходимо иметь учетную запись интеграции, интегрированную с приложением логики.