我有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)的输出格式化程序?
答案 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
包添加到项目中并添加
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);