Преобразование JSON в JSON с использованием JOLTTransformJSON NiFi

Я использую процессор JOLTTransformJson в Nifi.

Мой ввод:

[
  {
    "col_name": "time",
    "data_type": "timestamp",
    "is_nullable": true
  },
  {
    "col_name": "otherData",
    "data_type": "string",
    "is_nullable": false
  }
]

Я использую следующую спецификацию:

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "col_name": "name",
        "data_type": "type[0]",
        "is_nullable": {
          "true": "type[1]",
          "false": "type[1]"
        }
      }
    }
  },
  {
    "operation": "default",
    "spec": {
      "*": {
        "type[1]": "notnull"
      }
    }
  }
]

Ожидаемый результат:

{
  "type": "record",
  "name": "table_name",
  "fields": [
    {
      "name": "time",
      "type": [
        "timestamp",
        "null"
      ]
    },
    {
      "name": "otherData",
      "type": [
        "string",
        "notnull"
      ]
    }
  ]
}

Но получить приведенный ниже результат в качестве текущего результата, объединив все значения в массиве, например:

{
  "name": [
    "time",
    "otherData"
  ],
  "type": [
    [
      "timestamp",
      "int"
    ],
    null
  ]
}

Может кто-нибудь, пожалуйста, помогите, что мне не хватает.

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

Ответы 1

Ответ принят как подходящий

Вы можете использовать следующую спецификацию преобразования первого сдвига при обходе объектов массива, чтобы иметь возможность многократно применять методы:

[
  {
    "operation": "shift",
    "spec": {
      "#record": "type", // fixed values formed by using # wildcards left-hand-side
      "#table_name": "name",
      "*": {
        "col_*": "fields[#2].&(0,1)", // replicate the 1st replacement of the asterisk from the current(0th) level
        "is_nullable": { // conditional logic starts here
          "@(1,data_type)": "fields[#3].type",
          "true": {
            "#null": "fields[#4].type"
          },
          "false": {
            "#notnull": "fields[#4].type"
          }
        }
      }
    }
  },
  { //to sort the attributes within the fields array
    "operation": "sort",
    "spec": {
      "fields": ""
    }
  },
  { //to sort whole result
    "operation": "shift",
    "spec": {
      "type": "&",
      "name": "&",
      "fields": "&"
    }
  }
]

второе и третье преобразование просто добавляются для сортировки атрибутов/массивов по желанию

да, это дает результаты в отдельных полях, за исключением упорядочения в полях, мне нужно «имя» перед «типом» и в массиве «тип», сначала тип данных поля (метка времени/строка), затем нуль/не нуль

Ashu Tech 06.02.2023 08:49

это дает мне все упорядоченные, как и ожидалось, за исключением полей «тип»: [«null», «timestamp»] , которые должны быть «type»: [«timestamp», «null»]

Ashu Tech 06.02.2023 09:38

спасибо, это сработало, теперь я проверяю, может ли процессор NiFi JoltTransformJson принимать динамические значения, мне нужно передать значения для «#table_name»

Ashu Tech 06.02.2023 13:14

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