None of which work very well, and most are completely broken. The only ones that completely work are CLJ/CLJS/CLJR's internal implementations, so you have to pull in all of Clojure just to read EDN from java, for example.
Transit is a much better choice here, but even that tends to be a bit non-idiomatic in languages like Python. That's not really the fault of Transit though, languages are just too different to have a single communication protocol work flawlessly between them all.