Моя настройка процессора Apache: HandleHttpRequest -> InvokeHTTP ->HandleHttpResponse.
Я использую API от Postman, который вызывает другой API, получает данные JSON и возвращает результат.
Теперь между InvokeHTTP -> HandleHttpResponse я пытаюсь добавить еще один процессор, который изменяет данные перед возвратом ответа.
Мой JSON от InvokeHTTP
{
"id": 1,
"menuTempId": 28,
"conceptId": 252,
"menuId": 1,
"currency": "SAR",
"language": "En",
"updatedAt": 1695114353000,
"countryId": "SA",
"version": "v1",
"categories": [
{
"position": 5,
"id": 367,
"name": "Our New",
"isHidden": 0,
"is_toggle": 0,
"products": [
{
"id": 2724,
"position": 3,
"name": "Electric Lemonade",
"services": null,
"inSide": 0
},
{
"id": 2725,
"position": 4,
"name": "Electric Lemonade 2",
"services": null,
"inSide": 0
}
]
},
{
"position": 4,
"id": 368,
"name": "Our New 2",
"isHidden": 0,
"is_toggle": 0,
"products": [
{
"id": 2726,
"position": 3,
"name": "Electric Lemonade3",
"services": null,
"inSide": 0
},
{
"id": 2727,
"position": 4,
"name": "Electric Lemonade 4",
"services": null,
"inSide": 0
}
]
}
]
}
Я хочу изменить его, чтобы он выглядел так:
{
"id": 1,
"currency": "SAR",
"language": "En",
"countryId": "SA",
"version": "v1",
"categories": [
{
"position": 4,
"id": 368,
"name": "Our New 2",
"products": [
{
"id": 2726,
"position": 3,
"name": "Electric Lemonade3"
},
{
"id": 2727,
"position": 4,
"name": "Electric Lemonade 4"
}
]
}
]
}
Я хочу удалить несколько ключей из данных JSON. Я пробовал использовать UpdateAttribute -> JoltTransformJSON, но это не работает.
Можете ли вы помочь мне понять, с каким процессором и конфигурацией я могу достичь этого сценария.

это определение встряхивания должно работать для вас:
[
{
"operation": "shift",
"spec": {
"id": "id",
"currency": "currency",
"language": "language",
"countryId": "countryId",
"version": "version"
}
}
]
Добавляем только процессор JoltTransformJSON вместе со следующей спецификацией.
[
{
"operation": "shift",
"spec": {
"id|currency|language|countryId|version": "&"
}
}
]
достаточно.
Там, где операторы канала используются аналогично тому, как они (или двойные каналы) используются в некоторых известных языках программирования в качестве операторов ИЛИ, а амперсанд означает репликацию значений этих ключей.
Обновлено: Да, вы также можете получить последний желаемый результат. Используйте преобразование ниже из-за необходимости произвольно выбирать объект среди объектов массива products, например
[
{
"operation": "modify-overwrite-beta",
"spec": {
"categories": "=lastElement"
}
},
{
"operation": "shift",
"spec": {
"id|currency|language|countryId|version": "&",
"categories": {
"position|id|name": "&1[0].&",
"products": {
"*": {
"id|position|name": "&3[0].&2[&1].&"
}
}
}
}
}
]
Привет @NehaVerma, каково правило: всегда ли ты хочешь удалить первый объект или всегда оставлять только последний? Кстати, всегда ли в массиве «категории» есть два основных объекта?
Привет @Barbaros Özhan, массив категорий может содержать несколько объектов. Я хочу создать такие условия, как удаление объекта позиции 5 или удаление объекта позиции 4. Что-то вроде того. Точно так же я хочу проверить внутренние объекты категорий, а также массивы продуктов, чтобы удалить несколько ключей из объектов продуктов. Возможно ли это в Apache Nifi?
Большое спасибо Барбаросу Ожану, мне это помогло. Кроме того, теперь я могу понять, как работать с вложенными объектами в Apache NiFi.
Предположим, я хочу полностью изменить массив объектов без первого и последнего элементов. Тогда я пытаюсь применить это правило. Частично это работает, но не отображает данные внутри массива категорий; он создает свой собственный индекс. "0": [], "1":[]. @Barbaros [ { "operation": "shift", "spec": { "id|currency|language|countryId|version": "&", "categories": { "": { "position|id|name": "&1[0].&", "products": { "": { "id|position|name": "&3[0].&2[&1].&" } } } } } } ]
@NehaVerma 1-й: Кажется, вы пропустили звездочки для клавиш до ": { "position|id|name" и ": { "id|position|name":, 2-й: недавно опубликованная спецификация не дает результата, как вы упомянули, даже если эти звездочки добавлены.
Да, результат не тот, что я ожидал. Кроме того, звездочки не пропущены, мне не удалось их отправить в комментарий. Моё правило неверное? @Барбарос Ожан
@NehaVerma Затем (если не важно выбрать первый/последний, но только один) просто исправьте индекс под массивом "catergories" на 0, например [ { "operation": "shift", "spec": { "id|currency|language|countryId|version": "&", "categories": { "0": { "position|id|name": "&2[0].&", "products": { "*": { "id|position|name": "&4[0].&2[&1].&" } } } } } } ]
Вы можете просто использовать операцию удаления, чтобы удалить ненужные свойства из JSON в JoltTransformJSON.
[
{
"operation": "remove",
"spec": {
"menuTempId|conceptId|menuId|updatedAt": ""
}
}
]
Спасибо @Praveen kumar, это сработало. Я обновил свой JSON. Можете ли вы помочь мне с ключом удаления массива?
Спасибо @Barbaros Özhanr! Это сработало. Я обновил свой JSON. Можете ли вы помочь мне удалить ключ из массива?