Support Questions

Find answers, ask questions, and share your expertise

Generate processors dynamically from JSON Object length

avatar
New Contributor

Hi, I just started with NiFi. I've been looking for two days without success the answer to my problem. There it goes:

I have a EvaluateJsonPath that returns into an JSON NiFi Attribute some objects id in that way : [0, 1, 2, 3, 4, 5, 6, ...]. I would wish to create a processor (InvokeHttp) for each id dynamically. After that, each created processor should take the id from the JSON to generate the url.

How do i face it?? Thank you so much.

1 ACCEPTED SOLUTION

avatar
Master Guru

What you will want to do is split your original JSON into a flow file per id, and then send them all to a single InvokeHttp processor and reference a variable in URL of InvokeHttp. Here is a high-level of how it might work...

Lets say starting JSON is:

{ "ids" : [ "1", "2", "3" ] }

First use SplitJson processor with a Json Path of $.ids, this will produce 3 flow files where the content of each is 1, 2, and 3 respectively.

Second, use ExtractText processor.. add a user defined property with the name "my.id" and the value of (.*)

That will extract the content of each flow file into an attribute called my.id.

Finally, in InvokeHttp set the Remote URL to http://yourhost/path/${my.id}

When InvokeHttp processors a flow file, it will evaluate Remote URL against the incoming flow file attributes, and replace ${my.id} with the value of that attribute on the particular flow file, which in this case will be 1, 2, or 3.

View solution in original post

2 REPLIES 2

avatar
Master Guru

What you will want to do is split your original JSON into a flow file per id, and then send them all to a single InvokeHttp processor and reference a variable in URL of InvokeHttp. Here is a high-level of how it might work...

Lets say starting JSON is:

{ "ids" : [ "1", "2", "3" ] }

First use SplitJson processor with a Json Path of $.ids, this will produce 3 flow files where the content of each is 1, 2, and 3 respectively.

Second, use ExtractText processor.. add a user defined property with the name "my.id" and the value of (.*)

That will extract the content of each flow file into an attribute called my.id.

Finally, in InvokeHttp set the Remote URL to http://yourhost/path/${my.id}

When InvokeHttp processors a flow file, it will evaluate Remote URL against the incoming flow file attributes, and replace ${my.id} with the value of that attribute on the particular flow file, which in this case will be 1, 2, or 3.

avatar
New Contributor

Thank you so much, @Bryan Bende. Your approach absolutely works!