Делать преобразование ключей JSON с Apache NIFI - PullRequest
0 голосов
/ 24 марта 2019

Мне нужно сделать преобразование JSON в Apache NIFI.Ключи JSON в полезной нагрузке будут генерироваться динамически.Например, в приведенных ниже входных данных ' customer ' имеет атрибуты ' fname ' и ' lname '.Мне нужно изменить это ' имя_файла ' -> ' firstname ' и ' lname ' -> ' фамилия ', как указано в' mappingvalues ​​'.

Так как я новичок в nifi.Я не знаю с чего начать.Я пробовал некоторые трансформаторы JSON, такие как тряска.Но не удалось достичь ожидаемого результата.

Преобразование толчка, которое я использовал, приведено ниже:

[
  {
    "operation": "shift",
    "spec": {
      "customer": {
        "*": {
          "@": "&"
        }
      }
    }
  }
]

, который выдал вывод

{
  "fname" : "akhil",
  "lname" : "kumar"
}

Входи ожидаемый результат того, что мне нужно достичь, приведен ниже:


{
  "customer": {
    "fname": "akhil",
    "lname": "kumar",
    .
    .
    .
  },
  "mappingvalues": {
    "fname": "firstname",
    "lname": "lastname",
    .
    .
    .
  }
}

##OUTPUT
{
  "customer": {
    "firstname": "akhil",
    "lastname": "kumar",
    .
    .
    .
  }
}

* Есть ли способ добиться того же в нифи с использованием или без использования преобразования Джолта?Можно ли сделать то же самое с Groovy сценарием?* Пожалуйста, помогите мне в том же.

1 Ответ

1 голос
/ 24 марта 2019

код в groovy с рекурсивным отображением:

import groovy.json.JsonSlurper

def ff = session.get()
if(!ff)return

def json = ff.read().withReader("UTF-8"){r-> new JsonSlurper().parse(r) } 

def mappings = json.remove('mappingvalues')
def mapper(o, mappings){
    if(o instanceof Map){
        //json object. let's iterate it and do mapping
        o = o.collectEntries{k,v-> [ (mappings[k] ?: k), mapper(v,mappings) ] }
    }else if(o instanceof List){
        //map elements in array
        o = o.collect{v-> mapper(v,mappings) }
    }
    return o
}
json = mapper(json,mappings)

ff.write("UTF-8"){w-> new JsonBuilder(json).writeTo(w) }
REL_SUCCESS << ff
...