Another option would be to not output anything if there are no records, like the elasticsearch http query processor. Then if there ever *is* any output, it is always consistent.
On June 2, 2018 at 08:09:44, Mark Payne (marka...@hotmail.com) wrote: Matthew, Have you tried looking at the ConvertRecord processor? It is quite a bit newer and much preferred, IMO, over ConvertAvroToJSON. I believe it would give you the output that you’re expecting. Thanks -Mark Sent from my iPhone > On Jun 2, 2018, at 7:56 AM, Matthew Forrester <nifi-...@speechmarks.com> wrote: > > Hi, > > I am struggling with ConvertAvroToJson and have opened a ticket #5093. > > I have developed/hacked what is practically a replacement of this processor > at ( https://github.com/forbesmyester/NiFi-ConvertAvroToClassicJSON ) > because I struggle to see how in it's current state does not force strange > code on anything which receives it's output. > > You can configure this processor with two options, with the first value > being the default: > > * JSON container options: array/none > * Wrap Single Record: false/true > > Below are sample outputs for all possible options when encoding either some > items in a set, or an empty set. > > ## Array / True > Empty: `[{}]` > Some: `[{"name": "Ted", "age": 21},{"name": "Sam", "age": 19}]` > > ## Array / False > Empty: `{}` > Some: `[{"name": "Ted", "age": 21},{"name": "Sam", "age": 19}]` > > ## None / True > Empty: `{}` > Some: `{"name": "Ted", "age": 21}\n{"name": "Sam", "age": 19}` > > ## None / False > Empty: `{}` > Some: `{"name": "Ted", "age": 21}\n{"name": "Sam", "age": 19}` > > If I wanted to write code that receives and processes this data I would > probably say that all are not very helpful, requiring me to filter out > wierd empty objects. The second option is a complete nightmare because it > returns different types depending on if there are any items or not. > > It seems to me the biggest problem is the insertion of empty objects into > the output when the result is zero length. > > Would it be reasonable to add a configuration option called "Zero length > output handling" with the options of either `Inject Empty Object` (default) > or `Leave zero length`. When the `Leave zero length` option is selected it > would change the output to the following: > > ## Array / True / Leave Zero Length > Empty: `[]` > Some: `[{"name": "Ted", "age": 21},{"name": "Sam", "age": 19}]` > > ## Array / False / Leave Zero Length > Empty: `` > Some: `[{"name": "Ted", "age": 21},{"name": "Sam", "age": 19}]` > > ## None / True / Leave Zero Length > Empty: `` > Some: `{"name": "Ted", "age": 21}\n{"name": "Sam", "age": 19}` > > ## None / False / Leave Zero Length > Empty: `` > Some: `{"name": "Ted", "age": 21}\n{"name": "Sam", "age": 19}` > > With the option `Inject Empty Object` is selected the output would be > identical to what is now returned. > > If these changes were made (I am prepared to submit a PR) it would at least > be possible to write code which consumes the result without ugly hacks, > depending on selections made. > > I am however open to other suggestions for fixing this and would probably > still be happy to prepare the PR. > > Thanks > > Matt Forrester