用Apache Nifi进行JSON密钥转换

时间:2019-03-24 05:35:38

标签: groovy apache-nifi jolt

我需要在apache nifi中进行json转换。有效负载中的json键将动态生成。 例如,在下面的输入中,“ 客户”具有属性“ fname ”和“ lname ”。我需要更改此' fname '->' firstname '和' lname '->' lastname '按照“ 映射值”中的规定。

由于我是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",
    .
    .
    .
  }
}

*是否有任何方法可以在nifi中使用或不使用颠簸变换来实现相同效果?可以用groovy脚本做同样的事情吗? * 请同样帮我。

1 个答案:

答案 0 :(得分:1)

具有递归映射的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