One way (in NiFi 0.5.0+) is to use the ExecuteScript processor, which gives you full control over the session and flowfile(s). For example if you had JSON in your "kafka.key" attribute such as "{"data": {"myKey": "myValue"}}" , you could use the following Groovy script to parse out the value of the 'data.myKey' field:
def flowfile = session.get() if(!flowfile) return def json = new groovy.json.JsonSlurper().parseText(flowfile.getAttribute('kafka.key')) flowfile = session.putAttribute(flowfile, 'myKey', json.data.myKey) session.transfer(flowfile, REL_SUCCESS) I put an example of this up as a Gist ( https://gist.github.com/mattyb149/478864017ec70d76f74f) A possible improvement could be to add a "jsonPath" function to Expression Language, which could take any value (including an attribute) along with a JSONPath expression to evaluate against it... Regards, Matt On Mon, Mar 21, 2016 at 1:48 PM, McDermott, Chris Kevin (MSDU - STaTS/StorefrontRemote) <chris.mcderm...@hpe.com> wrote: > Joe, > > Thanks for the reply. I think I was not clear. > > The JSON I need to evaluate is in a FlowFile attribute (kafka.key) which I > need to be able to evaluate without modifying the original FlowFile content > (which was read from the Kafka topic). What I can’t figure out is how to > squirrel away the flowfile content so that I can write the value of the > kafka.key attribute to the FlowFile content, so that I can process it with > EvaluateJsonPath, and then read content I squirreled away back into the > FlowFile content. I considered using the the DistributedMapCache, but there > would be no guarantee what I added to the cache would still be there when I > needed it back. > > > > > On 3/21/16, 1:37 PM, "Joe Witt" <joe.w...@gmail.com> wrote: > > >Chris, > > > >Sounds like you have the right flow in mind already. EvaluateJSONPath > >does not write content. It merely evaluates the given jsonpath > >expression against the content of the flowfile and if appropriate > >creates a flowfile attribute of what it finds. > > > >For example if you have JSON from Twitter you can use EvaluateJsonPath > >and add a property with a name > >'twitter.user' and a value of '$.user.name' > > > >Once you run the tweets through each flow file will have an attribute > >called 'twitter.user' with the name found in the message. No > >manipulation of content at all. Just promotes things it finds to flow > >file attributes. > > > >Thanks > >Joe > > > >On Mon, Mar 21, 2016 at 1:34 PM, McDermott, Chris Kevin (MSDU - > >STaTS/StorefrontRemote) <chris.mcderm...@hpe.com> wrote: > >> What I need to do is read a file from Kafka. The Kafka key contains a > JSON string which I need to turn in FlowFile attributes while preserving > the original FlowFile content. Obviously I can use EvaluteJsonPath but > that necessitates replacing the FlowFile content with the kaka.key > attribute, thus loosing the original FlowFile content. I feel like I’m > missing something fundamental. >