Java Map <String, Object> emitido en Map <String, String> no arroja el error en tiempo de ejecución

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();
    }
}

El código anterior arroja un

ClassCastExecption en la línea 2: java.math.BigDecimal no se puede convertir a java.lang.String

Pero el tipo de resultado es agudamente Map[String, String], si el Tipo de valor del mapa no es Cadena, ¿por qué se ClassCastExecptionarroja en la línea 1?

Respuesta 1

El tipo de resultado es solo Map<String, String>porque tiene un yeso inseguro que lo hace así. Habrá una advertencia del compilador al respecto.

Los tipos genéricos existen solo en tiempo de compilación, en tiempo de ejecución el Mapa no verifica sus tipos de componentes.

String value = item.getValue();

Debido a los tipos genéricos, el compilador cree que este mapa solo contiene String, por lo que puede escribir la línea anterior. Pero lo que realmente compila es

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

y esto fallará si el valor es otra cosa.

"fuelAmount":20.0

Esto no es una cadena en JSON. Debe convertirlo usted mismo en una Cadena (o manejar otros tipos de valores que se devuelven del Mapa).

La mejor solución es probablemente hacer algunas clases "bean" para que el analizador JSON se deserialice. Esas pueden tener propiedades con nombre y tipo.

Respuesta: 2

Así que escribí un archivo ant build.xml donde tomo los archivos de clase de dos programas Java, uno que extiende el otro, los empaqueta en dos archivos jar separados y luego los inicia. <java ...

Tengo 2 Listas Java (Arraylists) de Flotadores, ListA y ListB de x e y coordinados que se parecen a: ListA = 10.1, 17.3, 30.0 ListB = 1.4, -14.7, 5.1 y quiero crear un objeto json de modo que ...

Considere este pequeño ejemplo ejecutable: import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.MouseWheelEvent; import java.awt.event.MouseWheelListener; ...

JTable y JXTables tienen una celda de encabezado que se genera sobre la barra de desplazamiento. Es una celda pequeña pero me gustaría usarla para representar un ícono y un menú emergente. ¿Cómo puedo acceder a esta celda de encabezado? ...