code: protected void traverseMap(Deque<JsonObject<String, Object>> stack, JsonObject<String, Object> jsonObj)
      {
          // Convert @keys to a Collection of Java objects.
          convertMapToKeysItems(jsonObj);
          final Object[] keys = (Object[]) jsonObj.get("@keys");
          final Object[] items = jsonObj.getArray();
  
          if (keys == null || items == null)
          {
              if (keys != items)
              {
                  throw new JsonIoException("Map written where one of @keys or @items is empty");
              }
              return;
          }
  
          final int size = keys.length;
          if (size != items.length)
          {
              throw new JsonIoException("Map written with @keys and @items entries of different sizes");
          }
  
          Object[] mapKeys = buildCollection(stack, keys, size);
          Object[] mapValues = buildCollection(stack, items, size);
  
          // Save these for later so that unresolved references inside keys or values
          // get patched first, and then build the Maps.
          prettyMaps.add(new Object[]{jsonObj, mapKeys, mapValues});
      }
docs: Process java.util.Map and it's derivatives.  These can be written specially
  so that the serialization would not expose the derivative class internals
  (internal fields of TreeMap for example).
  
  @param stack   a Stack (Deque) used to support graph traversal.
  @param jsonObj a Map-of-Map representation of the JSON input stream.