2016年11月3日木曜日

[Jackson]jsonをMapとして読み込んだ際の数値型を変更する

jsonをMapとして読み込んだ時のデフォルトのデータ型を変更する方法。

読み込むjson

{
  "number": 123456789012,
  "decimal": 1.1
}

デフォルトの設定で読み込んだ結果

こんな結果になる。整数の場合は、読み込む内容によってIntegerに変わったりします。
result = {number=123456789012, decimal=1.1}
number = java.lang.Long
decimal = java.lang.Double

データ型を変更する

下のようにUSE_BIG_INTEGER_FOR_INTSとUSE_BIG_DECIMAL_FOR_FLOATSを有効にします。
objectMapper.enable(DeserializationFeature.USE_BIG_INTEGER_FOR_INTS);
objectMapper.enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS);

変更後の読み込んだ結果

result = {number=123456789012, decimal=1.1}
number = java.math.BigInteger
decimal = java.math.BigDecimal

読み込みコードの全体

final ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enable(DeserializationFeature.USE_BIG_INTEGER_FOR_INTS);
objectMapper.enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS);

final TypeFactory factory = objectMapper.getTypeFactory();
final Map result =
    objectMapper.readValue(inputStream, factory.constructType(Map.class));
System.out.println("result = " + result);

outputType(result, "number");
outputType(result, "decimal");