.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。
解决方式:
- 给允许为空的字段添加
?标记,明确声明可空:
public string? Name { get; set; }
- 若不想修改实体类,可在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
相关产品推荐
相关产品推荐

