一、问题说明
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; }
}