【问题标题】:Do json key transformation with apache nifi用 apache nifi 做 json 密钥转换
【发布时间】:2019-03-24 05:35:38
【问题描述】:

我需要在 apache nifi 中进行 json 转换。负载中的 json 键将动态生成。 例如,在下面给出的输入中,“customer”具有属性“fname”和“lname”。我需要更改这个 'fname' -> 'firstname' 和 'lname' -> 'lastname'如“ma​​ppingvalues”中提供的那样。

因为我是 nifi 的新手。我不知道从哪里开始。我尝试了一些 json 转换器,例如 jolt。但达不到预期效果。

我使用的震动变换如下:

[
  {
    "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 中使用或不使用 jolt 变换来实现相同的效果?是否可以对 groovy 脚本做同样的事情? * 请帮助我。

【问题讨论】:

    标签: groovy apache-nifi jolt


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2020-10-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      • 2021-12-02
      • 2023-02-06
      相关资源
      最近更新 更多