Nick,

You could use ExecuteScript to manipulate the JSON.  The sample ECMAScript
below assumes that you already have the transformed timestamp as an
attribute "timestamp":

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);
}

You could also do the date conversion directly in Javascript with something
like:

contentObj.time = new Date(contentObj.time).valueOf() / 1000;


Thanks,

James

On Mon, Jan 9, 2017 at 1:52 PM, Nick Carenza <
[email protected]> wrote:

> Hey folks,
>
> I am having a hard time figuring out how to work with date values in json
> documents using the standard processors available in Nifi.
>
> example flowfile:
>
> {
>    "time": "2017-01-01T01:14:55+00:00",
>    "any": {
>       "nested": "data"
>     }
> }
>
> what i want:
>
> {
>   "time": 1483233295,
>    "any": {
>       "nested": "data"
>     }
> }
>
> I can extract the time field into an attribute with EvaluateJsonPath and
> then  using nifi expression language I can get a timestamp in seconds:
>
> ${time:toDate("yyyy-MM-dd'T'hh:mm:ss'+00:00'"):toNumber():divide(1000)}
>
> I can't find a way to get that value back into my document without losing
> nested data structures (AttributesToJson).
>
> I can't find anything in jolt-core that enables working with dates.
>
> Has anyone else been able to solve a transformation like this or know of a
> way to do it with standard nifi processors?
>
> If not? What options for enhancement seem best?
>
> - Enhance EvaluateJsonPath to be able to write to individual properties in
> a json document. Currently it can only overwrite the flowfile with the
> value of a single jsonpath expression.
>
> example properties:
> $.time : ${time:toDate("yyyy-MM-dd'T'hh:mm:ss'+00:00'"):toNumber():
> divide(1000)}
>
> - Extend Jolt with a customer transformer class
>
> - Enhance AttributesToJson to allow writing nested data structures. Behind
> a flag, each attribute value would be tested to see if it is valid json.
>
> Thanks,
> Nick
>

Reply via email to