Выяснение того, какой тип используется в HashMap

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

Например:

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

    }

Есть идеи о том, как получить тип данных с карты? заранее спасибо


person IrishCrf    schedule 14.02.2017    source источник
comment
map.get(key).getClass() stackoverflow.com / questions / 8029618 /   -  person Donald Wu    schedule 14.02.2017
comment
key.getClass ();   -  person    schedule 14.02.2017
comment
На карте нет метаданных. Вы можете знать класс ключа и значение конкретной записи, но не общие параметры.   -  person Maurice Perry    schedule 14.02.2017
comment
Вот ответ на аналогичный вопрос, который может помочь: stackoverflow.com/a/42236388/7563898   -  person CarManuel    schedule 15.02.2017
comment
Вот ответ на аналогичный вопрос, который может помочь: stackoverflow.com/a/42236388/7563898   -  person CarManuel    schedule 15.02.2017


Ответы (2)


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

Вот:

Обычно не одобряется использование типа Object без надобности. Но в зависимости от вашей ситуации вам может потребоваться 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
    }
}
person CarManuel    schedule 14.02.2017
comment
Я только что вернулся к работе после нескольких выходных. Собирался опубликовать ответ для тех, кто высказывал свои идеи. Это ТОЧНО, как я понял это в своей задаче выше. Я отмечу это как ответ. - person IrishCrf; 20.02.2017

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

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

Ссылка: Как получить тип значения для карта на Java?

person Pradeep    schedule 14.02.2017
comment
Невозможно в данном контексте: интересующая нас карта была получена из значения Map ‹String, Object›. - person Maurice Perry; 14.02.2017