2017-02-14 7 views
0

Ich habe eine HashMap, die aus einer JSON-Datei aufgefüllt wird. Die Werte im Schlüssel/Wert-Paar können zwei verschiedene Typen haben - String oder ein anderes Schlüssel/Wert-Paar.Herauszufinden, welcher Typ in HashMap verwendet wird

Zum Beispiel:

HashMap<String,Object> hashMap = new Map();

Die JSON-Datei sieht ein wenig so etwas wie dieses:

"custom": { 
     "mappedReference": {"source": "someMappedReference"}, 
     "somethingElse": "some literal" 
    } 
    } 

Später nach Hashmap bevölkern, wenn ich Iterieren bin durch ich überprüfen müssen, wenn Der Wert ist vom Typ HashMap oder String. Ich habe eine Reihe von Möglichkeiten ausprobiert, aber ich kann den Typ des Objekts nicht innerhalb der Map finden.

for(Map.Entry<String,Object> m : hashMap.entrySet()) 
    { 
     final String key = m.getKey(); 
     final Object value = m.getValue(); 

     if(value instanceof Map<String,String>) 
     { 
      //get key and value of the inner key-value pair... 
     } 
     else 
     { 
      //it's just a string and do what I need with a String. 
     } 

    } 

Irgendwelche Ideen, wie ich den Datentyp von der Karte bekommen kann? Vielen Dank im Voraus

+0

'' map.get (key) .getClass() '' http://stackoverflow.com/questions/8029618/get-variable-type-in-a-hashmap-in-java –

+0

Schlüssel. getClass(); –

+0

Eine Karte enthält keine Metadaten. Sie können die Klasse eines Schlüssels und den Wert eines bestimmten Eintrags kennen, jedoch nicht die generischen Parameter. –

Antwort

1

ich eine Antwort auf eine ähnliche Frage gestellt: https://stackoverflow.com/a/42236388/7563898

Hier ist sie:

Es ist im Allgemeinen verpönt, den Objekttyp unnötig zu verwenden. Aber abhängig von Ihrer Situation, müssen Sie möglicherweise eine HashMap haben, obwohl es am besten vermieden wird. Das heißt, wenn Sie einen verwenden müssen, hier ist ein kleiner Code-Schnipsel, der Ihnen helfen könnte. Es verwendet instanceof.

Map<String, Object> map = new HashMap<String, Object>(); 

for (Map.Entry<String, Object> e : map.entrySet()) { 
    if (e.getValue() instanceof Integer) { 
     // Do Integer things 
    } else if (e.getValue() instanceof String) { 
     // Do String things 
    } else if (e.getValue() instanceof Long) { 
     // Do Long things 
    } else { 
     // Do other thing, probably want error or print statement 
    } 
} 
+0

Ich bin nach ein paar Tagen wieder in Arbeit. Ich würde eine Antwort für diejenigen schreiben, die mit Ideen kommentieren. Dies ist GENAU, wie ich es in meinem eigenen Problem oben herausgefunden habe. Ich werde dies als die Antwort markieren. – IrishCrf

1

Sie können wie verwenden unten

ParameterizedType pt = (ParameterizedType)Generic.class.getDeclaredField("map").getGenericType(); 
      for(Type type : pt.getActualTypeArguments()) { 
       System.out.println(type.toString()); 

Ref: How to get value type of a map in Java?

+0

In diesem Kontext nicht möglich: Die Karte, an der wir interessiert sind, wurde von einem Wert einer Map abgerufen. –

Verwandte Themen