AbpvNext问题记录——post接口,接收前端发送的空串转换数字异常问题。

一、问题说明

1.前后端调试,发现通过post接口,采用json串发送的数据,如果后台的数据结构定义的是double,而前端传了空串"",后台会因类型不吻合报错。

2.简单查询了下,找到了重写json转换方法的位置,记录一下。

HttpApiHostModule.cs

csharp 复制代码
using System.Text.Json;
using System.Text.Json.Serialization;
 //配置位置的代码。
 public override void ConfigureServices(ServiceConfigurationContext context)
 {
     //配置json转换器
     context.Services.AddControllers().AddJsonOptions(options =>
     {
         options.JsonSerializerOptions.Converters.Add(new NullableDoubleConverter());
         options.JsonSerializerOptions.IgnoreNullValues = true;
     });
 }
//重写对应类型的转换方法
public class NullableDoubleConverter : JsonConverter<double?>
{
    public override double? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        // 如果是 null 或 空值
        if(reader.TokenType == JsonTokenType.Null)
        {
            return null;
        }

        if(reader.TokenType == JsonTokenType.String)
        {
            string stringValue = reader.GetString();

            // 处理 ""、"null"、"undefined"
            if(string.IsNullOrWhiteSpace(stringValue) ||
                stringValue.Equals("null", StringComparison.OrdinalIgnoreCase) ||
                stringValue.Equals("undefined", StringComparison.OrdinalIgnoreCase))
            {
                return null;
            }

            // 尝试解析
            if(double.TryParse(stringValue, out double result))
            {
                return result;
            }

            throw new JsonException($"无法将字符串 '{stringValue}' 转换为 double。");
        }

        // 如果是数字
        if(reader.TokenType == JsonTokenType.Number)
        {
            return reader.GetDouble();
        }

        throw new JsonException($"意外的 token 类型: {reader.TokenType},无法转换为 double?。");
    }

    public override void Write(Utf8JsonWriter writer, double? value, JsonSerializerOptions options)
    {
        if(value.HasValue)
        {
            writer.WriteNumberValue(value.Value);
        }
        else
        {
            writer.WriteNullValue();
        }
    }
}

	//后端接口样式
    public async Task<string> TestDoubleConvert([FromBody] TestClass? obj)
    {
        return "接收到的值="+obj.TestA;
    }
    public class TestClass
	{
    	public double? TestA { get; set; }
	}
相关推荐
呆呆敲代码的小Y2 小时前
【游戏开发】Lua 与 C# 交互原理解析
c#·lua·交互·热更新·lua与c#交互·游戏热更新
用户298698530142 小时前
PDF 转纯文本(TXT)免费攻略:轻松提取文字内容
人工智能·后端·c#
呆呆敲代码的小Y3 小时前
【游戏开发】C# 中的迭代器
java·开发语言·c#·迭代器
格林威21 小时前
C# 相机Burst模式图像采集:使用相机内存配合OpenCvSharp和Halcon实现短时间的高速采集的方法
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
J总裁的小芒果1 天前
参数过多-分批传参
c#
典典分享指南1 天前
短视频分镜提示词:让 AI 出片的产品口播
java·c#·bash·composer·symfony
Z5998178411 天前
c#软件开发学习笔记--WPF(Canvas、数据绑定、MVVM模式、值转换器)
笔记·学习·c#
淡海水1 天前
05-03-栈队列-PriorityQueue-TElement-TPriority-NET6优先队列语义与四叉堆实现
服务器·前端·c#·priorityqueue·clr·telement
leonkay2 天前
C# 特性(Attribute)——【1】基础讲解
开发语言·青少年编程·面试·c#·.net·个人开发