我遇到的问题是,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
答案 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