如何在ApiController的单个方法中返回JSON?

46

目前,我的ApiController返回XML作为响应,但是对于某个方法,我想返回JSON。即我不能进行全局更改以强制响应为JSON。

public class CarController : ApiController
{  
    [System.Web.Mvc.Route("api/Player/videos")]
    public HttpResponseMessage GetVideoMappings()
    {
        var model = new MyCarModel();    
        return model;
    }
}
我尝试过这样做,但似乎无法正确地将我的模型转换为JSON字符串:

我尝试过这样做,但好像不能正确地将我的模型转换成JSON字符串:

var jsonString = Json(model).ToString();    
var response = this.Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(jsonString, Encoding.UTF8, "application/json");
return response;

1
尝试使用返回类型JsonResult而不是HttpResponseMessage,然后您可以返回一个Json对象,例如:return Json(model) - Ricardo Pontual
尝试使用以下代码:ApiController.Ok,然后使用return Ok(model) - Mohammad Ali
@RicardoPontual 这是一个 System.Web.Mvc.JsonResult 吗?我得到了一个 "无法隐式转换类型 'System.Web.Http.Results.JsonResult<MyCarModel>' 到 'System.Web.Mvc.JsonResult'" 的错误。 - cool breeze
1
System.Web.Mvc.JsonResult, if your classe inherits from System.Web.Mvc.Controller, or you can maintain the HttpResponseMessage and use return Request.CreateResponse(HttpStatusCode.OK, model) - Ricardo Pontual
5个回答

79

如果无法全局更改以强制响应为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);    
}

7

返回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配置和序列化。


5
尝试使用此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 Core,他正在询问 .Net Framework 中的 ApiController。 - Sigex
@Sigex 不,不是这样的。 https://learn.microsoft.com/zh-cn/aspnet/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api - Mohammad Ali

2

对于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;
        }
    }
}

}

示例:帮助页面显示

这是一个显示帮助页面的示例。


0
也许问题出在WebApiConfig文件上。 在文件末尾添加这两行代码。
var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);

这是在 asp.net MVC 的 Project/App_Start/WebApiConfig.cs 文件中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接