关于jackson转换Java dataType

时间:2012-08-28 03:15:01

标签: java jackson

有一个项目使用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)

转换后如何保留原始数据类型?

2 个答案:

答案 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,则可以自由选择最有效的表示形式。