Postman调用Asp.net Core WebApi响应多出$id、$values字段解决方法
问题原因
接口响应中出现非预期的$id、$values字段,是项目使用Newtonsoft.Json作为JSON序列化组件时,开启了引用保留配置导致的。该配置原本用于处理对象循环引用、复用相同对象引用减少序列化体积,但会自动为所有对象生成$id元数据,同时将所有集合类型包装为带$values字段的对象结构,和常规JSON数组结构不符。
解决方案
根据实际配置场景选择对应处理方式即可:
- 全局配置修复(绝大多数场景适用)
找到项目中配置控制器服务的位置,修改Newtonsoft.Json序列化配置,关闭引用保留即可:
.NET 6+ (使用顶层语句的Program.cs):
.NET 5及更早版本(使用Startup.cs):builder.Services.AddControllers() .AddNewtonsoftJson(options => { // 关闭引用元数据生成,移除$id、$values字段 options.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.None; // 配置循环引用处理规则为忽略,避免序列化报错 options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; });
修改完成后重启应用,接口返回的集合会直接序列化为标准JSON数组,嵌套的空集合也会直接返回public void ConfigureServices(IServiceCollection services) { services.AddControllers() .AddNewtonsoftJson(options => { options.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.None; options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; }); }[],不再有多余包装字段。 - 单接口单独配置(全局需要保留引用处理时使用)
如果全局配置需要保留引用处理逻辑,仅需要个别接口返回标准JSON结构,可以在对应接口中单独指定序列化规则:public IActionResult GetFormConfigList() { var result = // 业务查询得到的结果集 var customSettings = new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.None, ReferenceLoopHandling = ReferenceLoopHandling.Ignore }; return Json(result, customSettings); } - 模型特性检查
如果没有手动修改过全局Newtonsoft.Json配置,检查返回的模型类是否标记了[DataContract(IsReference = true)]特性,该特性同样会触发序列化器生成引用元数据,移除特性或将IsReference属性设为false即可解决。
修复后预期响应结构
配置生效后,示例接口将返回如下标准结构:
[ { "tenentId": 21, "language": 1, "formId": "EmployeeGrid", "formName": "Employee Grid", "headerName": "KU Employee Main Grid", "subHeader": "Main Grid of the Employee Master", "navigation": "MainMenu>View Contact>Add New Contact", "remarks": "", "status": "", "formTitleDts": [] }, { "tenentId": 21, "language": 2, "formId": "EmployeeGrid", "formName": "Employee Grid", "headerName": "KU Employee Main Grid", "subHeader": "Main Grid of the Employee Master", "navigation": "MainMenu>View Contact>Add New Contact", "remarks": "", "status": "", "formTitleDts": [] } ]
内容的提问来源于stack exchange,提问作者Shakir Ali
相关产品推荐
相关产品推荐

