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

升级.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 版本的序列化逻辑:

  1. 安装对应版本的 NuGet 包:Microsoft.AspNetCore.Mvc.NewtonsoftJson(注意版本要和你的 .NET Core 3.1 框架版本匹配)
  2. 在 Startup.cs 的 ConfigureServices 方法中修改服务注册逻辑:
services.AddControllers()
    .AddNewtonsoftJson();

配置完成后即可恢复原有自动转换逻辑。

解决方案2:继续使用内置 System.Text.Json 实现转换

如果不想引入 Newtonsoft.Json 依赖,分两种情况处理:

  • 如果你已经给 .NET Core 3.1 项目升级了高版本的 System.Text.Json NuGet 包(≥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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 11:24:00