升级.NET Core 3.1后JSON Body字符串无法自动转int的解决方法咨询
问题根因
.NET Core 2.2 版本默认使用 Newtonsoft.Json(Json.NET)作为 JSON 序列化组件,该组件默认支持自动将字符串格式的数值转换为对应数值类型。从 .NET Core 3.0 开始,官方将默认序列化组件替换为内置的 System.Text.Json,默认配置下不允许字符串转数值类型,因此会抛出转换失败的错误。
解决方案1:换回 Newtonsoft.Json(兼容原有行为,改动最小)
这是最稳妥的方案,完全复用 .NET Core 2.2 版本的序列化逻辑:
- 安装对应版本的 NuGet 包:
Microsoft.AspNetCore.Mvc.NewtonsoftJson(注意版本要和你的 .NET Core 3.1 框架版本匹配) - 在
Startup.cs的ConfigureServices方法中修改服务注册逻辑:
services.AddControllers() .AddNewtonsoftJson();
配置完成后即可恢复原有自动转换逻辑。
解决方案2:继续使用内置 System.Text.Json 实现转换
如果不想引入 Newtonsoft.Json 依赖,分两种情况处理:
- 如果你已经给 .NET Core 3.1 项目升级了高版本的
System.Text.JsonNuGet 包(≥5.0版本),可以直接配置序列化选项:
services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.NumberHandling = System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString; });
- 如果使用 .NET Core 3.1 自带的低版本
System.Text.Json(无NumberHandling配置项),需要自定义数值转换器:
首先实现自定义转换器:
public class StringToIntConverter : JsonConverter<int> { public override int Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType == JsonTokenType.String && int.TryParse(reader.GetString(), out int value)) { return value; } return reader.GetInt32(); } public override void Write(Utf8JsonWriter writer, int value, JsonSerializerOptions options) { writer.WriteNumberValue(value); } }
然后注册转换器到全局配置:
services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new StringToIntConverter()); });
如果需要支持long、float等其他数值类型,按相同逻辑实现对应类型的转换器注册即可。
内容的提问来源于stack exchange,提问作者user13904118
相关产品推荐
相关产品推荐

