如何用System.Text.Json处理API返回的Decimal自定义空值?
处理API返回的Decimal类型自定义空值转换为null
核心思路很明确:先定义需要识别的自定义空值集合,然后针对响应中的Decimal字段做检查,匹配到集合内的值就替换为null,合法的Decimal字符串则保留(或按需转换为对应数值类型)。
Python 示例
直接遍历指定字段进行替换:
# 定义需要转换的自定义空值集合 custom_nulls = {"None", "-"} # API返回的原始响应 api_data = { "name": "MyName", "decimalOne": "0.01", "decimalTwo": "None", "decimalThree": "-" } # 指定需要处理的Decimal字段列表 decimal_fields = ["decimalOne", "decimalTwo", "decimalThree"] for field in decimal_fields: value = api_data.get(field) if value in custom_nulls: api_data[field] = None # 处理后的结果 print(api_data) # 输出: {'name': 'MyName', 'decimalOne': '0.01', 'decimalTwo': None, 'decimalThree': None}
如果需要将合法的Decimal字符串转为数值类型,可以补充类型转换逻辑:
# 转换合法Decimal字符串为数值(用decimal.Decimal更精确) from decimal import Decimal for field in decimal_fields: value = api_data.get(field) if value not in (None, *custom_nulls): try: api_data[field] = Decimal(value) except ValueError: # 处理非法数值,可返回null或抛出异常 api_data[field] = None
Java 示例(基于Jackson)
如果用Jackson做JSON反序列化,可以自定义反序列化器统一处理:
- 自定义Decimal反序列化器:
import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import java.io.IOException; import java.math.BigDecimal; import java.util.Set; public class CustomDecimalDeserializer extends JsonDeserializer<BigDecimal> { private static final Set<String> CUSTOM_NULL_VALUES = Set.of("None", "-"); @Override public BigDecimal deserialize(JsonParser parser, DeserializationContext context) throws IOException { String rawValue = parser.getText(); if (CUSTOM_NULL_VALUES.contains(rawValue)) { return null; } try { return new BigDecimal(rawValue); } catch (NumberFormatException e) { // 按需调整:抛出异常或返回null return null; } } }
- 在实体类的对应字段上添加注解:
import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import java.math.BigDecimal; public class ApiResponse { private String name; private BigDecimal decimalOne; @JsonDeserialize(using = CustomDecimalDeserializer.class) private BigDecimal decimalTwo; @JsonDeserialize(using = CustomDecimalDeserializer.class) private BigDecimal decimalThree; // 生成Getter、Setter方法 }
反序列化API响应时,"None"、"-"会自动转为null,合法的Decimal字符串会转为BigDecimal对象。
通用逻辑适配其他语言
不管用什么语言,核心步骤都是:
- 定义自定义空值的集合(比如
{"None", "-"}) - 定位需要处理的Decimal类型字段
- 遍历字段,判断值是否在空值集合中,是则替换为
null - 可选:将合法的字符串值转换为对应数值类型
内容的提问来源于stack exchange,提问作者kewur
相关产品推荐
相关产品推荐

