如何在 ApiController 中为单个方法返回 JSON?
Posted
技术标签:
【中文标题】如何在 ApiController 中为单个方法返回 JSON?【英文标题】:How to return JSON in an ApiController for a single method? 【发布时间】:2018-08-10 22:27:44 【问题描述】:目前,我的ApiController
s 正在返回 XML 作为响应,但对于单个方法,我想返回 JSON。即我无法进行全局更改以强制响应为 JSON。
public class CarController : ApiController
[System.Web.Mvc.Route("api/Player/videos")]
public HttpResponseMessage GetVideoMappings()
var model = new MyCarModel();
return model;
我尝试这样做,但似乎无法将我的模型正确转换为 JSON 字符串:
var jsonString = Json(model).ToString();
var response = this.Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(jsonString, Encoding.UTF8, "application/json");
return response;
【问题讨论】:
尝试返回类型JsonResult
而不是HttpResponseMessage
,那么你可以返回一个Json
对象,像这样:return Json(model)
试试这个ApiController.Ok你就做return Ok(model)
@RicardoPontual 是 System.Web.Mvc.JsonResult 吗?我收到了Cannot implicitly convert type 'System.Web.Http.Results.JsonResult<MyCarModel>' to 'System.Web.Mvc.JsonResult'
System.Web.Mvc.JsonResult
,如果你的类继承自System.Web.Mvc.Controller
,或者你可以维护HttpResponseMessage
并使用return Request.CreateResponse(HttpStatusCode.OK, model)
【参考方案1】:
如果您无法进行全局更改以强制响应为 JSON, 然后尝试:
[Route("api/Player/videos")]
public HttpResponseMessage GetVideoMappings()
var model = new MyCarModel();
return Request.CreateResponse(HttpStatusCode.OK,model,Configuration.Formatters.JsonFormatter);
或
[Route("api/Player/videos")]
public IHttpActionResult GetVideoMappings()
var model = new MyCarModel();
return Json(model);
如果要全局更改,那么先去YourProject/App_Start/WebApiConfig.cs
添加:
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(
config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml"));
在Register
方法的底部。
那就试试吧:
[Route("api/Player/videos")]
public IHttpActionResult GetVideoMappings()
var model = new MyCarModel();
return Ok(model);
【讨论】:
【参考方案2】:返回的是 XML 而不是 JSON,因为调用者正在请求 XML。可以使用过滤器将返回的格式强制为 JSON,该过滤器添加您需要的标头并让 MVC 解析 JSON。
public class AcceptHeaderJsonAttribute : ActionFilterAttribute
public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
actionContext.Request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
因此,您可以使用此属性装饰您想要强制 JSON 响应的方法,并与任何其他方法保持相同的全局 JSON 配置和序列化。
【讨论】:
【参考方案3】:对于 API 控制器,由调用者决定如何创建响应。除非您专门添加代码以仅强制一种类型的响应。下面是一个简单的 API 方法示例,以及调用请求 XML 或 JSON 时会发生什么。
public class XmlEampleController : ApiController
[HttpPost]
[ActionName("MyOrderAction")]
public HttpResponseMessage MyOrder([FromBody]MyOder order)
if (order != null)
return Request.CreateResponse<MyOder>(HttpStatusCode.Created, order);
return Request.CreateResponse(HttpStatusCode.BadRequest);
[Serializable]
public partial class MyOder
private string dataField;
public string MyData
get
return this.dataField;
set
this.dataField = value;
示例:
【讨论】:
【参考方案4】:试试这个ApiController.Ok
。
您只需执行return Ok(model)
并将返回类型更改为IHttpActionResult
。
例子:
public class CarController : ApiController
[System.Web.Mvc.Route("api/Player/videos")]
public IHttpActionResult GetVideoMappings()
var model = new MyCarModel();
return Ok(model);
【讨论】:
这是.Net核心,他在询问.Net Framework中的ApiController @Sigex 不是docs.microsoft.com/en-us/aspnet/web-api/overview/…【参考方案5】:可能问题出在 WebApiConfig 文件上。 在文件末尾添加这两行
var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
它在 Project/App_Start/WebApiConfig.cs 对于 asp.net MVC
【讨论】:
以上是关于如何在 ApiController 中为单个方法返回 JSON?的主要内容,如果未能解决你的问题,请参考以下文章
将所有 POST 请求路由到单个 ApiController