强制spring boot jackson deserializer使用BigDecimal

时间:2016-10-24 08:41:45

标签: java json spring serialization jackson

我遇到的问题是,jackson将数值反序列化为任意类型,我无法预测。例如,如果有人传递值“14”,则jackson将其实例化为pthread_cond_signal()。但是,如果有人传递值“14.01”,那么jackson会将其实例化为Integer。这是一个问题,因为我有一个自定义反序列化器(Double),它抛出异常,因为我无法预测将该字段强制转换为BigDecimal。理想情况下杰克逊只会把所有东西变成@JsonCreator

我发现了一篇帖子,暗示杰克逊可能会做这样的事情。 Deserialize JSON into a generic map, forcing all JSON floats into Decimal or String, in Jackson

但是,我无法弄清楚如何访问Spring Boot中隐藏的映射器对象,以便运行适当的方法BigDecimal

以下是反序列化程序的片段:

mapper.enable()

正如你在上面所看到的那样,@JsonCreator public OptionTransaction(Map<String,Object> jsonObj){ Map<String,Object> jsonOption = (Map<String, Object>) jsonObj.get("option"); Map<String,Object> optionPriceObj = (Map<String, Object>) jsonOption.get("price"); BigDecimal optionValue = new BigDecimal((Double) optionPriceObj.get("value")); 施法是一个问题,因为杰克逊有时不会进行双打。有没有人知道一个简单的方法让杰克逊总是输出BigDecimals,甚至只输出字符串?

更新

至于将双精度转换为BigDecimal,我通过以下方式修改application.properties来实现此目的:

Double

1 个答案:

答案 0 :(得分:4)

@JsonCreator
public OptionTransaction(Map<String,Object> jsonObj){  
    Map<String,Object> jsonOption = (Map<String, Object>) jsonObj.get("option");

    Map<String,Object> optionPriceObj = (Map<String, Object>) jsonOption.get("price");
    BigDecimal optionValue = new BigDecimal((Double) optionPriceObj.get("value"));
}

...

ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS);

OptionTransaction transaction = mapper.readValue(jsonString, OptionTransaction.class);

https://github.com/FasterXML/jackson-databind/wiki/Deserialization-Features