如何根据控制器设置json序列化程序选项(启动时不全局设置)?
上下文 我希望在ASP.NET核心控制器中返回JSON,并使用自定义的如何根据控制器设置json序列化程序选项(启动时不全局设置)?,json,asp.net-core,asp.net-web-api,Json,Asp.net Core,Asp.net Web Api,上下文 我希望在ASP.NET核心控制器中返回JSON,并使用自定义的JsonSerializerOptions,而不是在Startup 我的控制器继承自ControllerBase,因此没有Json(…)方法,在这里我有机会传递自定义JsonSerializerOptions。(我错过了什么?) 没有问题有Ok(…)和etc帮助程序。但是,这些选项不支持作为传递参数的自定义选项 问题 作为一种解决方法,我可以手动创建一个JsonResult,并将数据序列化到其中,还可以设置http状态,但这是
JsonSerializerOptions
,而不是在Startup
我的控制器继承自ControllerBase
,因此没有Json(…)
方法,在这里我有机会传递自定义JsonSerializerOptions
。(我错过了什么?)
没有问题有Ok(…)
和etc帮助程序。但是,这些选项不支持作为传递参数的自定义选项
问题
作为一种解决方法,我可以手动创建一个JsonResult
,并将数据序列化到其中,还可以设置http状态,但这是最简单的方法吗
(如果您使用的是
Newtonsoft
或System.Text.Json
只是共享,那么问题和答案是无关的。我打算使用System.Text.Json
)您可以使用JsonSerializer
类将Json序列化为所需的设置,然后通过Ok(serializedJson)
另一种方法是创建新的基本控制器类,其中包含Json帮助程序,然后可以从控制器中调用它们
public class BaseController : ControllerBase {
protected internal JsonResult Json(object data)
{
return Json(data, null /* contentType */, null /* contentEncoding */, JsonRequestBehavior.DenyGet);
}
protected internal JsonResult Json(object data, string contentType)
{
return Json(data, contentType, null /* contentEncoding */, JsonRequestBehavior.DenyGet);
}
protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding)
{
return Json(data, contentType, contentEncoding, JsonRequestBehavior.DenyGet);
}
protected internal JsonResult Json(object data, JsonRequestBehavior behavior)
{
return Json(data, null /* contentType */, null /* contentEncoding */, behavior);
}
protected internal JsonResult Json(object data, string contentType, JsonRequestBehavior behavior)
{
return Json(data, contentType, null /* contentEncoding */, behavior);
}
protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior)
{
return new JsonResult
{
Data = data,
ContentType = contentType,
ContentEncoding = contentEncoding,
JsonRequestBehavior = behavior
};
}
}
谢谢在您的解决方案中,您正在序列化一个字符串,该字符串实际上包含json内容。这与序列化原始对象不同,例如,引号将是escapedI。此版本的Escape没有问题,无论如何,您可以使用第二种方法并使用原始Json()帮助程序。
public class BaseController : ControllerBase {
protected internal JsonResult Json(object data)
{
return Json(data, null /* contentType */, null /* contentEncoding */, JsonRequestBehavior.DenyGet);
}
protected internal JsonResult Json(object data, string contentType)
{
return Json(data, contentType, null /* contentEncoding */, JsonRequestBehavior.DenyGet);
}
protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding)
{
return Json(data, contentType, contentEncoding, JsonRequestBehavior.DenyGet);
}
protected internal JsonResult Json(object data, JsonRequestBehavior behavior)
{
return Json(data, null /* contentType */, null /* contentEncoding */, behavior);
}
protected internal JsonResult Json(object data, string contentType, JsonRequestBehavior behavior)
{
return Json(data, contentType, null /* contentEncoding */, behavior);
}
protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior)
{
return new JsonResult
{
Data = data,
ContentType = contentType,
ContentEncoding = contentEncoding,
JsonRequestBehavior = behavior
};
}
}