|
@@ -5,6 +5,7 @@ import com.fasterxml.jackson.core.JsonProcessingException;
|
|
|
import com.fasterxml.jackson.core.JsonTokenId;
|
|
|
import com.fasterxml.jackson.databind.DeserializationContext;
|
|
|
import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
|
import java.io.IOException;
|
|
|
import java.math.BigDecimal;
|
|
@@ -15,6 +16,7 @@ import java.math.BigDecimal;
|
|
|
* @author wcz
|
|
|
* @since 2020/4/26
|
|
|
*/
|
|
|
+@Slf4j
|
|
|
public class BigDecimalDeserializer extends StdScalarDeserializer<BigDecimal> {
|
|
|
|
|
|
public static final BigDecimalDeserializer instance = new BigDecimalDeserializer();
|
|
@@ -24,29 +26,36 @@ public class BigDecimalDeserializer extends StdScalarDeserializer<BigDecimal> {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public BigDecimal deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
|
|
|
- switch (p.getCurrentTokenId()) {
|
|
|
+ public BigDecimal deserialize(JsonParser parser, DeserializationContext context) throws IOException, JsonProcessingException {
|
|
|
+ BigDecimal value;
|
|
|
+ switch (parser.getCurrentTokenId()) {
|
|
|
case JsonTokenId.ID_NUMBER_INT:
|
|
|
case JsonTokenId.ID_NUMBER_FLOAT:
|
|
|
- return p.getDecimalValue().setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
|
+ value = parser.getDecimalValue();
|
|
|
+ break;
|
|
|
case JsonTokenId.ID_STRING:
|
|
|
- String text = p.getText().trim();
|
|
|
+ String text = parser.getText().trim();
|
|
|
// note: no need to call `coerce` as this is never primitive
|
|
|
if (_isEmptyOrTextualNull(text)) {
|
|
|
- _verifyNullForScalarCoercion(ctxt, text);
|
|
|
- return getNullValue(ctxt).setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
|
+ _verifyNullForScalarCoercion(context, text);
|
|
|
+ value = getNullValue(context);
|
|
|
+ break;
|
|
|
}
|
|
|
- _verifyStringForScalarCoercion(ctxt, text);
|
|
|
+ _verifyStringForScalarCoercion(context, text);
|
|
|
try {
|
|
|
- return new BigDecimal(text).setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
|
- } catch (IllegalArgumentException iae) {
|
|
|
+ value = new BigDecimal(text);
|
|
|
+ break;
|
|
|
+ } catch (IllegalArgumentException ignore) {
|
|
|
}
|
|
|
- return ((BigDecimal) ctxt.handleWeirdStringValue(_valueClass, text,
|
|
|
- "not a valid representation")).setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
|
+ value = ((BigDecimal) context.handleWeirdStringValue(_valueClass, text, "not a valid representation"));
|
|
|
+ break;
|
|
|
case JsonTokenId.ID_START_ARRAY:
|
|
|
- return _deserializeFromArray(p, ctxt).setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
|
+ value = _deserializeFromArray(parser, context);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ // Otherwise, no can do:
|
|
|
+ value = ((BigDecimal) context.handleUnexpectedToken(_valueClass, parser));
|
|
|
}
|
|
|
- // Otherwise, no can do:
|
|
|
- return ((BigDecimal) ctxt.handleUnexpectedToken(_valueClass, p)).setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
|
+ return value.setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
|
}
|
|
|
}
|