如何更改核心中某些操作 Asp.Net 序列化方法(类型化,无)?



我有 asp.net 核心2.2 Web应用程序。应用程序包含命令和查询操作,命令操作必须返回键入的 json 响应:

{
$type:"A.B.Customer, x.dll ",
id: 11231,
name: "Erwin .."
}

查询操作必须返回非类型化响应:

{
id: 34234,
name: "Erwin .. "
}

我们可以在启动时为 Json 响应选择一个输出格式化程序。

services.AddMvc().AddJsonOptions(o =>
{
SerializerSettings.TypeNameHandling=Newtonsoft.Json.TypeNameHandling.Objects
// SerializerSettings.TypeNameHandling = Newtonsoft.Json.TypeNameHandling.None
}

那么如何通过操作更改相同响应类型(应用程序/json)的输出格式化程序呢?

有多种方法可以做到这一点。

一种是直接调用 JSON.NET 方法并将设置传递给它。

JsonSerializerSettings settings = new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Objects
};
return base.Content(JsonConvert.SerializeObject(query, settings), "application/json");

或者,返回JsonResult

JsonSerializerSettings settings = new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Objects
};
return new JsonResult(query, settings);

小心第二个示例。在.NET Core 3.0中,JSON.NET 不再硬连接到 ASP.NET Core,ASP.NET Core提供不带 JSON.NET 并使用新的System.Text.Json类基础跨度。

在 ASP.NET Core 2.x中,JsonResult接受JsonSerializerSettings作为第二个参数。 从 ASP.NET Core 3.x开始,JsonResult接受object,并且根据所使用的序列化程序,需要不同的类型。

这意味着,如果您在代码中使用第二个示例,则在迁移到 Core 3.0 时(首先)它将中断 ASP.NET 因为它不再依赖于 JSON.NET。您可以通过将Newtonsoft.Json包添加到项目中并添加 JSON.NET 回到它

servics.AddNewtonsoftJson();

在您的ConfigureServices方法中,再次使用 JSON.NET。但是,如果将来您决定放弃 JSON.NET 并使用System.Text.Json或任何其他 Json 序列化程序,则必须更改使用它的所有位置。

随意将其更改为扩展方法,创建自己的操作结果类继承自JsonResult等。

public class TypelessJsonResult : JsonResult
{
public TypelessJsonResult(object value) : base(value)
{
SerializerSettings.TypeNameHandling = TypeNameHandling.None;
}
}

并将控制器的操作代码减少到

return new TypelessJsonResult(query);

最新更新