I'm reluctant to use advises for it, not based on my own experience, but
based on advice from the Elisp manual:
[...] advice should be reserved for the cases where you cannot modify
a function’s behavior in any other way. [...] In particular, Emacs’s
own source files should not put advice on functions in Emacs. (There
are currently a few exceptions to this convention, but we aim to
correct them.)
Here we do have a chance to modify the functions' behavior.
How about a sort of compromise between our approaches: provide
'json-read-object' and 'json-read-array' with pre- and post-read
callback functions, that are only called when they're set. That would
make it possible to leverage the power of 'json-read-object' and
'json-read-array' by binding the callback functions, without mixing
alien logic into them.