Процессор Apache Nifi для обновления данных JSON перед возвратом в HandleHttpResponse

Моя настройка процессора 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, но это не работает.

Можете ли вы помочь мне понять, с каким процессором и конфигурацией я могу достичь этого сценария.

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
1
0
99
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

это определение встряхивания должно работать для вас:

[
  {
    "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].&"
          }
        }
      }
    }
  }
]

Спасибо @Barbaros Özhanr! Это сработало. Я обновил свой JSON. Можете ли вы помочь мне удалить ключ из массива?

Neha Verma 02.10.2023 19:06

Привет @NehaVerma, каково правило: всегда ли ты хочешь удалить первый объект или всегда оставлять только последний? Кстати, всегда ли в массиве «категории» есть два основных объекта?

Barbaros Özhan 02.10.2023 19:49

Привет @Barbaros Özhan, массив категорий может содержать несколько объектов. Я хочу создать такие условия, как удаление объекта позиции 5 или удаление объекта позиции 4. Что-то вроде того. Точно так же я хочу проверить внутренние объекты категорий, а также массивы продуктов, чтобы удалить несколько ключей из объектов продуктов. Возможно ли это в Apache Nifi?

Neha Verma 03.10.2023 06:45

Большое спасибо Барбаросу Ожану, мне это помогло. Кроме того, теперь я могу понять, как работать с вложенными объектами в Apache NiFi.

Neha Verma 04.10.2023 07:00

Предположим, я хочу полностью изменить массив объектов без первого и последнего элементов. Тогда я пытаюсь применить это правило. Частично это работает, но не отображает данные внутри массива категорий; он создает свой собственный индекс. "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].&" } } } } } } ]

Neha Verma 04.10.2023 12:05

@NehaVerma 1-й: Кажется, вы пропустили звездочки для клавиш до ": { "position|id|name" и ": { "id|position|name":, 2-й: недавно опубликованная спецификация не дает результата, как вы упомянули, даже если эти звездочки добавлены.

Barbaros Özhan 04.10.2023 13:03

Да, результат не тот, что я ожидал. Кроме того, звездочки не пропущены, мне не удалось их отправить в комментарий. Моё правило неверное? @Барбарос Ожан

Neha Verma 04.10.2023 13:58

@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].&" } } } } } } ]

Barbaros Özhan 04.10.2023 14:09

Вы можете просто использовать операцию удаления, чтобы удалить ненужные свойства из JSON в JoltTransformJSON.

[
  {
    "operation": "remove",
    "spec": {
      "menuTempId|conceptId|menuId|updatedAt": ""
    }
  }
]

Спасибо @Praveen kumar, это сработало. Я обновил свой JSON. Можете ли вы помочь мне с ключом удаления массива?

Neha Verma 02.10.2023 19:06

Другие вопросы по теме