Я использую Jackson 2.4 для преобразования POJO в/из Maps. Я написал небольшую тестовую программу, как показано ниже.Отображение типа Java Jackson по умолчанию
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Map;
public class TestObjectMapper {
private Object byteVal;
private Object shortVal;
private Object intVal;
private Object longVal;
private Object floatVal;
private Object doubleVal;
public TestObjectMapper() {
byteVal = (byte) 127;
shortVal = (short) 255;
intVal = 10;
longVal = 20L;
floatVal = 1.2F;
doubleVal = 1.4;
System.out.println("Constructor");
System.out.println("byteVal.getClass() = " + byteVal.getClass());
System.out.println("shortVal.getClass() = " + shortVal.getClass());
System.out.println("intVal.getClass() = " + intVal.getClass());
System.out.println("longVal.getClass() = " + longVal.getClass());
System.out.println("floatVal.getClass() = " + floatVal.getClass());
System.out.println("doubleVal.getClass() = " + doubleVal.getClass());
System.out.println();
}
public Object getByteVal() {
return byteVal;
}
public Object getShortVal() {
return shortVal;
}
public Object getIntVal() {
return intVal;
}
public Object getLongVal() {
return longVal;
}
public Object getFloatVal() {
return floatVal;
}
public Object getDoubleVal() {
return doubleVal;
}
public static void main(String[] args) {
ObjectMapper mapper = new ObjectMapper();
TestObjectMapper t = new TestObjectMapper();
Map map = mapper.convertValue(t, Map.class);
System.out.println("map = " + map);
System.out.println();
for (Object key : map.keySet()) {
System.out.format("map.get(\"%s\").getClass() = %s\n", key, map.get(key).getClass());
}
String k = "byteVal";
System.out.format("((Integer) map.get(\"%s\")).byteValue() = %d\n",
k, ((Integer) map.get(k)).byteValue());
k = "floatVal";
System.out.format("((Double) map.get(\"%s\")).floatValue() = %f\n",
k, ((Double) map.get(k)).floatValue());
}
}
, который генерирует следующий вывод:
Constructor
byteVal.getClass() = class java.lang.Byte
shortVal.getClass() = class java.lang.Short
intVal.getClass() = class java.lang.Integer
longVal.getClass() = class java.lang.Long
floatVal.getClass() = class java.lang.Float
doubleVal.getClass() = class java.lang.Double
map = {byteVal=127, shortVal=255, intVal=10, longVal=20, floatVal=1.2000000476837158, doubleVal=1.4}
map.get("byteVal").getClass() = class java.lang.Integer
map.get("shortVal").getClass() = class java.lang.Short
map.get("intVal").getClass() = class java.lang.Integer
map.get("longVal").getClass() = class java.lang.Long
map.get("floatVal").getClass() = class java.lang.Double
map.get("doubleVal").getClass() = class java.lang.Double
((Integer) map.get("byteVal")).byteValue() = 127
((Double) map.get("floatVal")).floatValue() = 1.200000
Почему отображение типов правильно в некоторых случаях, но не в других? Есть ли способ контролировать это без каких-либо изменений в моих классах?
Что вы имеете в виду под "правильным"? Вы ожидаете, что Джексон будет читать ваши мысли, когда вы не объявите какой-либо конкретный тип на своих полях? – chrylis
Не могли бы вы прояснить вопросы? В чем именно проблема? –
Разница - Byte-> Integer и Float-> Double. В Json нет типа Byte. Таким образом, Float и Byte будут преобразованы в тип Number в JSON. См. Http://www.tutorialspoint.com/json/json_data_types.htm, так что это имеет смысл, поскольку Number - формат с плавающей запятой с двойной точностью в JavaScript. – nomoa