Search code examples
groovyapache-nifi

json to json conversion by ExecuteScript processor


I have following json data and i want to convert data in expected result by ExecuteScript nifi processor

{
"time": "2017-01-01T01:14:55+00:00",
"any": {
"nested": "data"
}
}

expected Result

{
"time": 1483233295,
"any": {
"nested": "data"
}
}

I am using following groovy code but getting some error please help to find the solution

var flowFile = session.get();
if (flowFile !== null) {

var StreamCallback = Java.type("org.apache.nifi.processor.io.StreamCallback");
var IOUtils = Java.type("org.apache.commons.io.IOUtils");
var StandardCharsets = Java.type("java.nio.charset.StandardCharsets");

flowFile = session.write(flowFile, new 
        StreamCallback(function(inputStream, outputStream) {

var inputJSON = IOUtils.toString(inputStream,StandardCharsets.UTF_8);
var contentObj = JSON.parse(inputJSON);

contentObj.time = flowFile.getAttribute("timestamp");


outputStream.write(JSON.stringify(contentObj).getBytes(StandardCharsets.UTF_8));
}));

session.transfer(flowFile, REL_SUCCESS);
}

getting error

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
/home/jdoodle.groovy: 8: unable to resolve class StreamCallback
 @ line 8, column 36.
   flowFile = session.write(flowFile, new 
                                      ^

1 error

Solution

  • use ExecuteGroovyScript processor (it's optimized for groovy lang) with this kind of code:

    import groovy.json.JsonSlurper
    import groovy.json.JsonBuilder
    
    def flowFile = session.get()
    if (!flowFile) return
    
    flowFile.write{rawIn, rawOut->
        def json = rawIn.withReader("UTF-8"){ r-> new JsonSlurper().parse(r) }
        json.time = Date.parse("yyyy-MM-dd'T'HH:mm:ssX", json.time).getTime()/1000
        rawOut.withWriter("UTF-8"){ w-> new JsonBuilder(json).writeTo(w) }
    }
    
    REL_SUCCESS << flowFile
    

    this code converts format of the field time with Date format to unix epoch time inside json content of flowfile.