2017-02-14 3 views
0

У меня есть HashMap, который заполняется из файла JSON. Значения в паре ключ-значение могут быть двух разных типов: String или другой пары ключ-значение.Определение типа, используемого в HashMap

Например:

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

Файл JSON выглядит немного что-то вроде этого:

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

Позже после заполнения HashMap, когда я переборе мне нужно проверить, если значение имеет тип HashMap или String. Я пробовал несколько способов, но, похоже, я не могу получить тип объекта на карте.

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. 
     } 

    } 

Любые идеи о том, как я могу получить тип данных с карты? Заранее спасибо

+0

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

+0

ключ. GetClass(); –

+0

Карта не имеет метаданных. Вы можете узнать класс ключа и значение определенной записи, но не общие параметры. –

ответ

1

Я отправил ответ на подобный вопрос: https://stackoverflow.com/a/42236388/7563898

Вот он:

Обычно он неохотно использует тип объекта. Но в зависимости от вашей ситуации вам может потребоваться HashMap, хотя его лучше избегать. Тем не менее, если вам нужно использовать один, вот небольшой фрагмент кода, который может помочь. Он использует 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

Я только что вернулся в работу после нескольких выходных. Я собирался опубликовать ответ для тех, кто комментировал идеи. Это ТОЧНО, как я понял это в своей собственной проблеме выше. Я отмечу это как ответ. – IrishCrf

1

Вы можете использовать, как показано ниже

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

Невозможно в этом контексте: карта, которая нас интересует, была получена из значения Map . –

Смежные вопросы