code: protected Object convertMapsToObjects(final JsonObject<String, Object> root)
      {
          final Deque<JsonObject<String, Object>> stack = new ArrayDeque<JsonObject<String, Object>>();
          stack.addFirst(root);
  
          while (!stack.isEmpty())
          {
              final JsonObject<String, Object> jsonObj = stack.removeFirst();
  
              if (jsonObj.isArray())
              {
                  traverseArray(stack, jsonObj);
              }
              else if (jsonObj.isCollection())
              {
                  traverseCollection(stack, jsonObj);
              }
              else if (jsonObj.isMap())
              {
                  traverseMap(stack, jsonObj);
              }
              else
              {
                  Object special;
                  if ((special = readIfMatching(jsonObj, null, stack)) != null)
                  {
                      jsonObj.target = special;
                  }
                  else
                  {
                      traverseFields(stack, jsonObj);
                  }
              }
          }
          return root.target;
      }
docs: Walk a JsonObject (Map of String keys to values) and return the
  Java object equivalent filled in as best as possible (everything
  except unresolved reference fields or unresolved array/collection elements).
  
  @param root JsonObject reference to a Map-of-Maps representation of the JSON
  input after it has been completely read.
  @return Properly constructed, typed, Java object graph built from a Map
  of Maps representation (JsonObject root).