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

.NET5升级至.NET7后JSON序列化失效问题求助

问题解决思路与方案

一、先获取HTTP 400的具体验证错误信息

要定位400响应的根源,最快的方式是让后端返回明确的验证错误详情:

方法1:自定义API异常过滤器

创建过滤器类捕获模型验证失败场景,将错误信息返回给前端:

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

public class ModelValidationFilter : IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext context)
    {
        if (!context.ModelState.IsValid)
        {
            var errors = context.ModelState
                .Where(x => x.Value.Errors.Any())
                .ToDictionary(
                    kvp => kvp.Key,
                    kvp => kvp.Value.Errors.Select(e => e.ErrorMessage).ToArray()
                );
            context.Result = new BadRequestObjectResult(new { Errors = errors });
        }
    }

    public void OnActionExecuted(ActionExecutedContext context) { }
}

在Program.cs(.NET7替代原Startup)中注册过滤器:

builder.Services.AddControllers(options =>
{
    options.Filters.Add<ModelValidationFilter>();
});

此后前端收到400响应时,能直接拿到具体字段的错误提示,比如字段为空、类型不匹配等。

方法2:控制器内手动检查验证状态

如果不想新增过滤器,也可以在接口中临时添加验证逻辑:

public IActionResult Insert([FromBody] Rol entity)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
    return Ok(service.Insert(entity));
}

返回的ModelState会包含所有验证失败的细节。


二、修复NewtonsoftJson配置错误(原.NET7序列化异常核心原因)

你原配置存在关键问题:.AddNewtonsoftJson()后调用的.AddJsonOptions()是给System.Text.Json配置参数,而非Newtonsoft.Json!这直接导致Newtonsoft的配置未生效,才出现属性名乱转的情况。

正确的NewtonsoftJson配置方式:

services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        // 配置Newtonsoft的枚举转字符串规则
        options.SerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter());
        // 如需统一命名策略,可在此配置(比如驼峰命名)
        // options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
    });

注意:JsonPropertyName是System.Text.Json的属性,若使用NewtonsoftJson,需替换为Newtonsoft.Json.JsonProperty:

[Newtonsoft.Json.JsonProperty("interfaceId")]
public long INTERFACE_ID { get; set; }

三、处理可空策略导致的400问题

.NET7默认启用可空引用类型,若Rol类中存在非可空的引用类型字段,前端未传值时会触发模型验证失败,返回400。

解决方式:

  1. 给允许为空的字段添加?标记,明确声明可空:
public string? Name { get; set; }
  1. 若不想修改实体类,可在Program.cs中关闭可空引用类型的验证:
builder.Services.AddControllers(options =>
{
    options.ModelMetadataDetailsProviders.Add(new SuppressChildValidationMetadataProvider(typeof(string)));
})
// 或全局配置忽略空值序列化
.AddJsonOptions(options =>
{
    options.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
});

更推荐第一种方式,符合.NET7的设计规范,代码可读性更强。


四、最终配置建议

  • 若需继续使用NewtonsoftJson(依赖其特定特性):确保配置与属性注解对应正确,避免混用System.Text.Json的配置项。
  • 若可切换到System.Text.Json(.NET7官方推荐):移除.AddNewtonsoftJson(),保留JsonPropertyName属性,同时配置System.Text.Json的选项:
services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
        // 如需统一驼峰命名,可开启此配置,无需逐个字段加JsonPropertyName
        // options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
    });

内容的提问来源于stack exchange,提问作者Lucas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 14:27:56