Why compare by path
A line diff on formatted JSON reports a reordered key as two changes and a re-indented block as a hundred. Comparing by path reports what actually differs - one line per changed value, with the path you would use to reach it in code.
About the TypeScript output
Objects inside the same array are merged rather than emitted one per shape: a key missing from some rows becomes optional, and a key whose type varies becomes a union. That is what the API really returns, and User1 / User2 / User3 would only hide it.
What CSV cannot carry
Nested objects are flattened into dotted columns, and a nested array becomes one cell of JSON - a spreadsheet has nowhere else to put it, and exploding it would silently change the row count.