@SuppressWarnings("unchecked")
  public Map<?, ?> read(Json json, JsonValue jsonData) {

    Map<K, V> values;

    try {
      values = (Map<K, V>) map.map().newInstance();
    } catch (InstantiationException | IllegalAccessException e) {
      throw new GdxRuntimeException(e);
    }

    JsonValue entry = jsonData.getChild(name);

    while (entry != null) {

      JsonValue keyValue = entry.get("key");
      K key = json.readValue((Class<K>) map.key(), keyValue);

      JsonValue valueValue = entry.get("value");
      V value = json.readValue((Class<V>) map.value(), valueValue);

      values.put(key, value);

      entry = entry.next;
    }

    return values;
  }
  @SuppressWarnings("unchecked")
  public <M> M read(
      Json json, JsonValue jsonData, Supplier<M> newInstance, KeyValueConsumer<M, K, V> put) {

    M values = newInstance.get();

    JsonValue entry = jsonData.getChild(name);

    while (entry != null) {

      JsonValue keyValue = entry.get("key");
      K key = json.readValue((Class<K>) map.key(), keyValue);

      JsonValue valueValue = entry.get("value");
      V value = json.readValue((Class<V>) map.value(), valueValue);

      put.accept(values, key, value);

      entry = entry.next;
    }

    return values;
  }
  public <E> void write(
      Json json, Iterable<E> entries, Function<E, ?> getKey, Function<E, ?> getValue) {

    json.writeArrayStart(name);

    entries.forEach(
        entry -> {
          json.writeObjectStart();

          json.writeValue("key", getKey.apply(entry), map.key());
          json.writeValue("value", getValue.apply(entry), map.value());

          json.writeObjectEnd();
        });

    json.writeArrayEnd();
  }