Created 03-29-2018 03:43 PM
Hi Team ,
My flow file content like
[{"Id":"43","name":"ABC"},{"Id":"44","name":"Xyz"}]
I need data as below .Please suggest which processor helps us ..
{"Id":"43","name":"ABC"}{"Id":"44","name":"Xyz"}
Thanks,
Siva v
Created on 03-29-2018 09:02 PM - edited 08-17-2019 09:43 PM
You can use split json processor, this processor will split json array of messages into individual messages as content of each flowfile i.e if your json array having 100 messages in it then split json processor splits relation will output 100 flowfiles having each message in it.
JsonPath Expression
$.*
with this configuration we are splitting json array into individual messages.
Input to splitjson processor:-
[{"Id":"43","name":"ABC"},{"Id":"44","name":"Xyz"}]
Output from splitjson processor:-
We are going to have 2 flowfiles(as we are having 2 json messages in array)
flowfile1:-
{"Id":"43","name":"ABC"}
flowfile2:-
{"Id":"44","name":"Xyz"}
As you mentioned in the question your expected output would be {"Id":"43","name":"ABC"}{"Id":"44","name":"Xyz"}
for this case after splitjson processor use merge content processor
now in this merge content processor we are merging all the splits into one flowfile by using merge strategy as Defragment
Use Merged relation from merge content processor which will give your desired results.
Output from Merge Content processor:-
{"Id":"43","name":"ABC"}{"Id":"44","name":"Xyz"}
Flow:-
1.SplitJson processor //for splitting arrays into individual messages 2.Merge content //to merge the splitted messages into one flowfile content using defragment strategy
(or)
Method2:-
By using Replace text processor:-
{"Id":"43","name":"ABC"}{"Id":"44","name":"Xyz"}
Search Value
\[(.*?)\]
Replacement Value
$1
Maximum Buffer Size
1 MB //needs to change this value if your json message size is more than 1 MB
Replacement Strategy
Regex Replace
Evaluation Mode
Entire text
In this processor we are capturing all the json message without [](squarebrackets) and replacing that as flowfile content
Input:-
[{"Id":"43","name":"ABC"},{"Id":"44","name":"Xyz"}]
Output:-
Now in output flowfile content we are not having square brackets.
{"Id":"43","name":"ABC"},{"Id":"44","name":"Xyz"}
Use another Replace text processor to replace "}, with "}
Now we are literally checking for the "}, in content and replacing with "}
Configs:-
Search Value
"},
Replacement Value
"}
Maximum Buffer Size
1 MB //needs to change this value if your json message size is more than 1 MB
Replacement Strategy
Literal Replace
Evaluation Mode
Entire text
Input flowfile:-
{"Id":"43","name":"ABC"},{"Id":"44","name":"Xyz"}
Output Flowfile:-
{"Id":"43","name":"ABC"}{"Id":"44","name":"Xyz"}
Flow:-
1.Replacetext processor //to capture all the content of flowfile without square brackets([]) 2.Replacetext processor //replace "}, with "}
In both methods we are going to have same output as you can decide which method best fits for your case.
Let us know if you are having any issues ..!!
Created 04-01-2018 02:41 PM
Does the answer helped to resolve your issue, Click on Accept button below to accept the answer,to close the thread and it would be great help to Community users to find solution quickly for these kind of issues.
Created 04-26-2019 08:36 AM
@Shu This solution doesn't work if I have multiple arrays in one json message. Example - {"TxnMessage": {"HeaderData": {"EventCatg": "F"},"PostInrlTxn": {"Key": {"Acnt": "1234567890","Date": "20181018"},"Id": "3456","AdDa": {"Area": [{"HgmId": "","HntAm": 0},{"HgmId": "","HntAm": 0}]},"escTx": "Reload","seTb": {"seEnt": [{"seId": "CAKE","rCd": 678},{"seId": "","rCd": 0}]},"Bal": 6766}}}
If you could help with analysis and/or pointers on how each element of array in such input can be split into a separate rows?