Deserialización personalizada en un mapa usando Gson

Tengo el JSON a continuación:

{
    "abc": {
        "linkedTo": "count",
        // possibly more data...
    },
    "plmtq": {
        "linkedTo": "title",
        "decode": "true",
        // possibly more data...
    }
}

Necesito cargar este JSON en unMap<String, Holder>, con llaves"abc" y"plmtq".
Abajo está miHolder clase:

public class Holder {
  private final Map<String, String> data;

  public Holder(Map<String, String> data) {
    this.data = data;
  }

  // More methods in this class...
}

El JSON no coincide con la estructura de mi clase., pero no puedo cambiar el JSON o las clases.
Lo que necesito es una forma de personalizar la deserialización para poder analizar el JSON en unMap<String, Holder>.
¿Hay alguna forma de hacer esto?

A continuación se muestra el código que hace eso, pero parece demasiado complejo y debe haber una forma más sencilla de hacerlo ...

private static Map<String, Holder> getMap(String jsonLine)
{
    Map<String, Holder> holder = new HashMap<>();
    JsonElement jelement = new JsonParser().parse(jsonLine);
    JsonObject jobject = jelement.getAsJsonObject();

    for (Map.Entry<String, JsonElement> entry : jobject.entrySet())
    {
        Map<String, String> metadata = new HashMap<>();
        JsonObject element = entry.getValue().getAsJsonObject();

        for (Map.Entry<String, JsonElement> entry2 : element.entrySet())
        {
            metadata.put(entry2.getKey(), entry2.getValue().getAsString());
        }

        holder.put(entry.getKey(), new Holder(metadata));
    }
    return holder;
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta