我使用傑克遜2.4來轉換POJO /從地圖。我寫了一個小測試程序如下。Java傑克遜默認類型映射
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 2014-11-05 08:50:52
你能否澄清一下問題?究竟是什麼問題? – 2014-11-05 09:00:04
差異是Byte-> Integer和Float-> Double。 Json中沒有Byte類型。所以Float和Byte將被轉換爲JSON中的Number類型。 請參閱http://www.tutorialspoint.com/json/json_data_types.htm,因此Number是JavaScript中的雙精度浮點格式 – nomoa 2014-11-05 09:23:26