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

时间:2018-03-02 16:48:47

标签: c# asp.net-mvc asp.net-web-api asp.net-web-api2 asp.net-apicontroller

目前,我的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字符串:

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

5 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分: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配置和序列化。

答案 2 :(得分:0)

试试这个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);
    }
}

答案 3 :(得分:0)

问题可能在于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

答案 4 :(得分:0)

对于API控制器,由调用者决定如何创建响应。除非您专门添加代码以强制只有一种类型的响应。这是一个简单的API方法示例,以及在调用请求XML或JSON时会发生什么。

guide_legend(override.aes

样品:Help page display