#filter #dataweave
#Фильтр #сохранение данных
Вопрос:
У меня есть следующий код:
%dw 2.0 output application/json var attributeIdMapping =
${vault::attributeIdMapping}
--- {
"objectTypeId": 3,
"attributes": vars.requestBody mapObject (value, key) ->
{
"objectTypeAttributeId": (attributeIdMapping.attributes filter ($.name == key))[0].id,
"objectAttributeValues": [{
"value": value,
"key": key
}]
} }
attributeIdMapping:
{
"attributes": [
{
"name": "accountType",
"id": "87"
},
{
"name": "accountClass",
"id": "89"
},
{
"name": "accountName",
"id": "85"
},
{
"name": "displayName",
"id": "18"
},
{
"name": "accountCategory",
"id": "88"
},
{
"name": "accountNumber",
"id": "84"
},
{
"name": "description",
"id": "86"
},
{
"name": "accountGroup",
"id": "90"
}
]
}
vars.RequestBody:
{
"displayName": "TestMulesoft2",
"description": "Test"
}
Но мой фильтр показывает null в конце. Как я понимаю, ключ не передается на уровень ниже самой карты. Как я могу заставить это работать?
Комментарии:
1. Вы должны четко понимать свои входные данные и использование. Что содержит vars.RequestBody ? что содержит attributeIdMapping.attributes ? Почему вы фильтруете $.name с помощью ключа, известного как идентификаторы индексов?
2. Здравствуйте. Обновлен исходный пост со значениями переменных. В качестве дополнительного комментария код работает так, как должен, если я, например, изменю ключ фильтра на «описание».
3. Каков ожидаемый результат, если он сработал?
Ответ №1:
Я помещаю все входные данные внутрь скрипта, чтобы упростить воспроизведение. Проблема, по-видимому, заключается в использовании оператора ==
для сравнения строки, а типы ключей возвращают значение empty. Использование оператора ~=
, который пытается принудить, возвращает ожидаемый результат:
%dw 2.0
output application/json
var attributeIdMapping =
{
"attributes": [
{
"name": "accountType",
"id": "87"
},
{
"name": "accountClass",
"id": "89"
},
{
"name": "accountName",
"id": "85"
},
{
"name": "displayName",
"id": "18"
},
{
"name": "accountCategory",
"id": "88"
},
{
"name": "accountNumber",
"id": "84"
},
{
"name": "description",
"id": "86"
},
{
"name": "accountGroup",
"id": "90"
}
]
}
var requestBody = {
"displayName": "TestMulesoft2",
"description": "Test"
}
--- {
"objectTypeId": 3,
"attributes": requestBody mapObject (value, key) ->
{
"objectTypeAttributeId": (attributeIdMapping.attributes filter ($.name ~= key))[0].id,
"objectAttributeValues": [{
"value": value,
"key": key
}]
} }
Вывод:
{
"objectTypeId": 3,
"attributes": {
"objectTypeAttributeId": "18",
"objectAttributeValues": [
{
"value": "TestMulesoft2",
"key": "displayName"
}
],
"objectTypeAttributeId": "86",
"objectAttributeValues": [
{
"value": "Test",
"key": "description"
}
]
}
}
Комментарии:
1. Еще один вопрос. Есть ли простой способ получить все сопоставленные значения для объекта? Так что это было бы похоже:
{ "objectTypeId": 3, "attributes": [{ "objectTypeAttributeId": 18, "objectAttributeValues": [{ "value": "TestMulesoft" }] }, { "objectTypeAttributeId": 86, "objectAttributeValues": [{ "value": "TestMulesoft" }] }] }
2. Решил это, используя pluck вместо MapObject.