This topic came up today when we discussed the #crewmeister API, and made me think.
Until I remembered that we once in a project used to use the pure
POST params, which are basically key-value pairs.
And the question also reminded me of my PHP times, there
the server-side knew how to handle a key which looks like
and builds and array. But when I ran into that problem back then
we used to use python and there we didn't have that.
Final answer: Use JSON where possible! There might be some overhead (if you don't use nodejs) on the backend, because you will need a JSON decoder. But therefore you have a well-defined format for receiving the data. Transfer binary data, like image uploads in separate requests encoded accordingly and you will be fine, I think.