Hardly anyone has a system with written in only one language. Typically you'll have a mix of both languages, some statically typed, some dynamic, so strongly typed, some not. The problem is not about serializing data from language A and deserializing back to language A, although that comes with enough problems (e.g. what if you language supports functions as first-class types?), but going from language A, serializing the data, and then deserializing it to a language that may or may not support something the source language has built in: floating point, complex types, UTF8 strings, and so on.
Presumably, if you're exchanging data between languages A and B, you have already figured out how to translate you want to map all of the data structures between them.
Then, what I would expect you do is that you have code in A that can translate Complex Data Structure -> Lowest Common Denominator Data Structure -> A built-in JSON serialization -> JSON -> B built-in JSON deserialization -> Lowest Common Denominator -> Complex Data Structure B.
Of course, the language/library can't help with the complex -> lowest common denominator translation part, that one will have to get written by hand. But that shouldn't mean that the lowest common denominator has to be as basic as JSON itself.