diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/integration/iwork/jackson/LenientIntegerDeserializer.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/integration/iwork/jackson/LenientIntegerDeserializer.java new file mode 100644 index 00000000..8258e4d9 --- /dev/null +++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/integration/iwork/jackson/LenientIntegerDeserializer.java @@ -0,0 +1,54 @@ +package com.zt.plat.module.system.service.integration.iwork.jackson; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; + +import java.io.IOException; +import java.math.BigDecimal; + +/** + * Jackson 反序列化器,允许将诸如 "0.0"、"5" 等字符串形式的数字解析为整数, + * 用于兼容 iWork 返回的非标准整型字段。 + */ +public class LenientIntegerDeserializer extends JsonDeserializer { + + @Override + public Integer deserialize(JsonParser parser, DeserializationContext ctxt) throws IOException { + JsonToken token = parser.currentToken(); + if (token == null) { + token = parser.nextToken(); + } + if (token == null) { + return null; + } + if (token.isNumeric()) { + return parser.getNumberValue().intValue(); + } + if (token == JsonToken.VALUE_STRING) { + String text = parser.getText(); + if (text == null) { + return null; + } + String trimmed = text.trim(); + if (trimmed.isEmpty()) { + return null; + } + try { + if (trimmed.contains(".")) { + BigDecimal decimal = new BigDecimal(trimmed); + return decimal.intValue(); + } + return Integer.parseInt(trimmed); + } catch (NumberFormatException ex) { + return (Integer) ctxt.handleWeirdStringValue(Integer.class, trimmed, + "无法将文本转换为整数"); + } + } + if (token == JsonToken.VALUE_NULL) { + return null; + } + return (Integer) ctxt.handleUnexpectedToken(Integer.class, parser); + } +}