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

时间:2019-07-17 08:15:12

标签: asp.net-core asp.net-web-api json.net

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

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

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

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

我们可以在启动时为Json响应选择一个outputformatter。

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

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

1 个答案:

答案 0 :(得分:1)

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

一种方法是直接调用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,并且根据所使用的序列化程序,期望使用其他类型。

这意味着,如果您在代码中使用第二个示例,则在迁移到ASP.NET Core 3.0时,它(首先)会中断,因为它不再依赖于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);