.NET 6 API用JObject接收任意合法JSON报错,如何解决?
问题分析与解决方案
报错原因
你的问题出在.NET 6默认使用System.Text.Json作为JSON序列化器,而JObject是Newtonsoft.Json(Json.NET)的专属类型,两者序列化体系不兼容,导致模型绑定失败,返回400验证错误。
替代方案(按实现复杂度排序)
方案1:直接读取请求体字符串(最适合你的需求)
既然你只需要将JSON转为字符串记录日志,完全不需要解析JSON结构,直接读取原始请求体是最简单的方式:
public async Task<IActionResult> LogSomeJSONendpoint() { using var reader = new StreamReader(Request.Body); var payload = await reader.ReadToEndAsync(); Log.Information(payload); return Ok(); }
方案2:使用System.Text.Json的JsonElement类型
如果需要偶尔解析JSON结构,同时保持默认序列化体系,用JsonElement替代JObject:
public async Task<IActionResult> LogSomeJSONendpoint([FromBody] JsonElement payload) { var jsonString = payload.GetRawText(); Log.Information(jsonString); return Ok(); }
JsonElement是System.Text.Json中用于表示任意JSON元素的类型,支持所有合法JSON格式,能直接转为原始JSON字符串。
方案3:切换项目使用Newtonsoft.Json(兼容JObject)
如果你坚持要用JObject,需要将项目的JSON序列化器切换为Newtonsoft.Json:
- 安装NuGet包:
Microsoft.AspNetCore.Mvc.NewtonsoftJson - 在
Program.cs中配置:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers() .AddNewtonsoftJson(); // 添加这一行
配置完成后,你的原始代码就能正常接收任意合法JSON了。
关于JObject的疑问
JObject本身确实可以接收任意合法JSON,但必须确保项目使用Newtonsoft.Json作为JSON序列化器。.NET 6及以后版本默认用System.Text.Json,和Newtonsoft.Json的类型不互通,这是你之前报错的核心原因。
内容的提问来源于stack exchange,提问作者penstiaGarse
相关产品推荐
相关产品推荐

