Карта Javaприведение к картене выкидывать ошибку во время выполнения - PullRequest
0 голосов
/ 23 января 2019
private static String tmp = "{\"data\":{\"vin\":\"LNBSCCAK9JD065606\",\"extParameter\":{\"systemTime\":\"2019-01-23 12:58:35\",\"fuelAmount\":20.0},\"pushType\":\"fuelWarn\"},\"type\":\"uaes-iot-public-service\"}";

public static void main(String[] args) {
    JSONObject jsonObject = JSON.parseObject(tmp);
    JSONObject data = JSON.parseObject(jsonObject.getString("data"));
    // line 1
    Map<String, String> result = (Map<String, String>) data.getInnerMap().get("extParameter");

    for (Map.Entry<String, String> item: result.entrySet()) {
        String key = item.getKey();
        // line 2
        String value = item.getValue();
    }
}

Выше кода выдает

ClassCastExecption в строке 2: java.math.BigDecimal не может быть приведен к java.lang.String

Но результаттип является точным Map[String, String], если тип значения карты не является строкой, почему ClassCastExecption выбрасывается в строке 1?

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Тип результата только Map<String, String>, потому что у вас небезопасное приведение, которое делает его таким. Об этом будет предупреждение компилятора.

Универсальные типы существуют только во время компиляции, во время выполнения Карта не проверяет свои типы компонентов.

String value = item.getValue();

Из-за универсальных типов компилятор считает, что эта карта содержит только String, поэтому вы можете написать строку выше. Но на самом деле он компилируется в

String value = (String) item.getValue(); // cast inserted by compiler

и произойдет сбой, если значение окажется чем-то другим.

"fuelAmount":20.0

Это не строка в JSON. Вы должны преобразовать его в строку самостоятельно (или обработать другие типы значений, возвращаемых с карты).

Лучшее решение, вероятно, состоит в том, чтобы создать несколько "bean-классов" для десериализации JSON-анализатора. Они могут иметь именованные и типизированные свойства.

0 голосов
/ 23 января 2019

Поле "fuelAmount" хранит десятичные значения, поэтому система пытается преобразовать ваше десятичное число в String, которое вы пытаетесь привести, так что это приведет к ошибке.

...