nifi:如何改变json的价值?

时间:2017-06-02 18:09:58

标签: apache-nifi

我有处理器InvokeHTTP,它给出了json结果。 例如:

{
  "revision" : {
    "clientId" : "dc572274-4b71-11b6-e415-b91e391bcf4d",
    "version" : 7
  },
  "id" : "dc572260-4b71-11b6-0371-f73573ab44fe",
  "uri" : "http://x.x.x.x:9090/nifi-api/processors/dc572260-4b71-0371-73ab44fe",
  "position" : {
    "x" : -1021.9568138214972,
    "y" : 333.2029958718132
  }
}

我想为InvokeHTTP的每个传入响应动态更改版本的值。 如何实现这个目标?

2 个答案:

答案 0 :(得分:1)

我可以建议使用groovy语言

的ExecuteScript处理器
import groovy.json.*

def ff = session.get()
if(!ff) return
ff = session.write(ff, {rawIn, rawOut->
    //parse flowfile content to maps & arrays
    def json = new JsonSlurper().parse(rawIn, "UTF-8")
    //change json 
    json.revision.version =  (json.revision.version as Long) + 1
    //write to output changed content
    rawOut.withWriter("UTF-8"){ it.write( JsonOutput.toJson(json) )}
} as StreamCallback)
session.transfer(ff, REL_SUCCESS)

答案 1 :(得分:1)

您可以使用以下处理器序列:EvaluateJsonPath获取属性值,UpdateAttribute更改它,ReplaceText使用正则表达式替换新内容中的旧值。

对于ReplaceText处理器,请使用以下参数:

Regexp Replace策略

搜索值:(?s)("version"\s*:\s*)(\d+)

替换值:$1${VERSION}(其中VERSION是保存新值的属性名称)

这是测试正则表达式的一个很好的资源: https://regex101.com/r/JOrZNp/1