mel*_*r55 3 java serialization spring json jackson
我有一个问题,其中杰克逊将数字值反序列化为我无法预测的任意类型。例如,如果有人传递值“ 14”,则杰克逊会将其实例化为Integer。但是,如果有人传递值“ 14.01”,则杰克逊会将其实例化为Double。这是一个问题,因为我有一个自定义解串器(@JsonCreator),由于无法预测将字段强制转换为BigDecimal,因此会引发异常。理想情况下,杰克逊将一切变成了BigDecimal。
我发现一篇帖子暗示杰克逊可能有能力做这样的事情。 在Jackson中将JSON反序列化为通用映射,强制将所有JSON浮点数转换为Decimal或String
但是,我无法弄清楚如何访问隐藏在Spring Boot中的mapper对象以运行适当的方法 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"));
Run Code Online (Sandbox Code Playgroud)
正如您在上面看到的那样,该转换Double是一个问题,因为杰克逊有时无法获得双打。有谁知道一种让杰克逊始终输出BigDecimals或什至只是字符串的简单方法?
更新:
至于将双打转换为BigDecimal,我可以通过以下方式修改application.properties来实现:
# ===============================
# = DESERIALIZATION CUSTOMIZATION
# ===============================
spring.jackson.deserialization.USE_BIG_DECIMAL_FOR_FLOATS=true
Run Code Online (Sandbox Code Playgroud)
@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"));
}
Run Code Online (Sandbox Code Playgroud)
..
ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS);
OptionTransaction transaction = mapper.readValue(jsonString, OptionTransaction.class);
Run Code Online (Sandbox Code Playgroud)
https://github.com/FasterXML/jackson-databind/wiki/反序列化功能