You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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反序列化,可以自定义反序列化器统一处理:

  1. 自定义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;
        }
    }
}
  1. 在实体类的对应字段上添加注解:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 21:20:31