1

Jackson を使用するプロジェクトがあり、Java オブジェクト Data があります。オブジェクトにはプロパティがあり、Raw オブジェクトでもあります。このオブジェクトには、次のようなプロパティがありますList<Object[]>

public class Data{
    Raw raw;
}

public class Raw{
    List<Object[]> list;
}

Object[]データ型がlongで、値が 123 の場合、Jackson はこのデータ型を に変換します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等しくなりません。JSON が処理できる最大数は 64 ビットの倍精度です。newNumbers100L

バイナリ イメージのようにデータのシリアル化を行う場合は、Base64 でデータをエンコードします。

于 2012-08-28T03:38:59.843 に答える
0

代わりにtype of を使用するとNumber、必要な型として値を簡単に取得できます。他の人が指摘しているように、JSON には「整数」型しかなく、期待される Java 型を指摘する内容は何もありません。これは、クラスが予想される型を示す必要があることを意味します。そして、あなたが提案するのが だけである場合Object、最も効率的な表現を自由に選択できます。

于 2012-08-28T18:48:16.230 に答える