有一个项目使用Jackson,并且有一个Java对象数据。在对象中,有一个属性,它也是一个对象Raw。在这个对象中,有一个属性List<Object[]>
e.g:
public class Data{
Raw raw;
}
public class Raw{
List<Object[]> list;
}
如果Object[]
的数据类型为long
,并且我给出了值:123,则杰克逊会将此数据类型转换为int
,
即:如果值为length < long && > int
,数据类型也为long
,如果为length < int
,则数据类型将变为int
。
我使用的方法:
byte[] bytes = writeValueAsBytes(Data), Data data = readValue(bytes, Data.class)
转换后如何保留原始数据类型?
答案 0 :(得分:1)
@Test
public void testJackson() throws Exception {
List<Number> numbers = new ArrayList<Number>();
numbers.add(100L);
numbers.add(new Long(Integer.MAX_VALUE) + 1000L);
numbers.add(10.0);
ObjectMapper om = new ObjectMapper();
System.out.println(om.writeValueAsString(numbers));
List<Number> newNumbers = om.readValue(om.writeValueAsString(numbers), ArrayList.class);
System.out.println(newNumbers);
assertEquals(Integer.class, newNumbers.get(0).getClass());
assertEquals(newNumbers.get(1).getClass(), Long.class);
assertTrue(! numbers.equals(newNumbers) );
}
但是numbers
不等于newNumbers
,因为100L
应该是整数。
JSON可以处理的最大数量是64位双精度。
如果像二进制图像那样进行数据序列化,那么我将在Base64中对数据进行编码。
答案 1 :(得分:0)
您可能希望使用Number
的类型,因此您可以轻松地获取所需类型的值。正如其他人所指出的那样,JSON只有“整数”类型,并且内容中没有任何内容可以指出预期的Java类型。这意味着您的班级必须指明预期的类型;如果您所有建议都是Object
,则可以自由选择最有效的表示形式。