Some languages have natural support for JSON in the form of literals.
The obvious case is JavaScript where a JSON object is just a standard object, and therefore it maps to an object literal, e.g.:
var someJson = { foo: "bar"};
Ruby, Groovy, and Python have support for Map (Hash) Literals, so that's a natural way to express Json objects in those languages
{ 'foo' => 'bar'} # Ruby - this is a Hash
{ foo: 'bar'} // Groovy - this is a Map
{ 'foo': 'bar'} // Python - this is a Hash
Unfortunately Java has no support for Map literals (or anything similar). So if we mapped a Json object to a Map in Java you'd have to do something like this:
Map<String, Object> map = new HashMap<>();
map.put("foo", "bar");
Which I think you agree is pretty ugly.
For this reason, I created the class JsonObject. The idea behind this is its a more natural way to represent a JsonObject when you're programming in Java (it has typed methods for putting etc).
JsonObject is only really intended for use in Java verticles, and is automatically converted back and forth to to the more natural types when passed to other languages.
So if you're sending a JsonObject from Java you should expect to receive it as a Map in Groovy, an object in Java, an object in Python etc. And if you send an object from Java or a Map in Groovy you should receive it as a JsonObject in Java.