1

有一个项目使用 Jackson,并有一个 Java 对象 Data。在对象中,有一个属性,也是一个对象Raw。在这个对象中,有一个属性,List<Object[]> 例如:

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)

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

4

2 回答 2

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。

于 2012-08-28T03:38:59.843 回答
0

您可能想改用 type of Number,因此您可以轻松获取所需的任何类型的值。正如其他人指出的那样,JSON 只有“整数”类型,内容中没有任何内容可以指出预期的 Java 类型。这意味着您的 Class 必须指明预期的类型;如果您建议的只是Object,则可以自由选择最有效的表示。

于 2012-08-28T18:48:16.230 回答