.NET Core如何仅序列化接口属性返回正确格式IActionResult
解决方案
两种方法都可以实现需求,都是.NET原生支持的写法,不需要引入第三方组件。
方式一:直接让内置Json方法按接口类型序列化
内置Json()方法默认按对象的运行时实际类型(SoccerTeam/BasketTeam)执行序列化,所以会带出实现类的独有属性。调用时指定序列化的声明类型即可,和你手动调用JsonSerializer.Serialize<ISport>()的逻辑完全一致:
var options = new JsonSerializerOptions(JsonSerializerDefaults.Web); // 第三个参数指定序列化时使用IEnumerable<ISport>作为类型依据,忽略实现类独有属性 return Json(sportscollection, options, typeof(IEnumerable<ISport>));
这个写法会自动把响应头Content-Type设置为application/json,输出的JSON就是只包含TeamName字段的结构,不会出现多余属性。
如果需要全局生效,可以在Program.cs中配置MVC默认的JSON序列化规则,不用每个Action单独写配置。
方式二:将已序列化完成的JSON字符串直接返回为JSON格式响应
如果你已经提前生成了符合要求的JSON字符串,不要用Ok(json)或者Json(json)返回——这两个方法会把字符串当做普通文本值二次序列化,最终返回带转义引号的字符串结构。直接返回ContentResult并指定内容类型即可:
IEnumerable<ISport> sportscollection = Repository.GetAllSports(); // 手动序列化得到的正确JSON字符串 string jsonStr = JsonSerializer.Serialize<IEnumerable<ISport>>(sportscollection); // 指定内容类型为application/json,直接返回原始JSON内容 return Content(jsonStr, "application/json");
这种方式不会触发二次序列化,浏览器收到的就是标准JSON结构,和JsonResult的响应效果完全一致。
内容的提问来源于stack exchange,提问作者Chuck Montana
相关产品推荐
相关产品推荐

