How to return JSON in an ApiController for a single method?

84,657

Solution 1

If you can't make a global change to force responses as JSON, then try:

[Route("api/Player/videos")]
public HttpResponseMessage GetVideoMappings()
{
    var model = new MyCarModel();
    return Request.CreateResponse(HttpStatusCode.OK,model,Configuration.Formatters.JsonFormatter);
}

OR

[Route("api/Player/videos")]
public IHttpActionResult GetVideoMappings()
{
    var model = new MyCarModel();
    return Json(model);    
}

If you want to change globally, then first go to YourProject/App_Start/WebApiConfig.cs and add:

config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(
config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml"));

at the bottom of the Register method.

Then try:

[Route("api/Player/videos")]
public IHttpActionResult GetVideoMappings()
{
    var model = new MyCarModel();
    return Ok(model);    
}

Solution 2

The XML is returned instead JSON because the caller is requesting XML. The returned format can be forced to JSON using a filter that adds the header you need and lets MVC resolve the JSON.

public class AcceptHeaderJsonAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        actionContext.Request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));    
    }
}

So you can decorate the method you want to force a JSON response with this attribute and keep the same global JSON configuration and serialization as any other method.

Solution 3

For API controllers it is up to the caller to determine how the response is created. Unless you specifically add code to force only one type of response. Here is a simple example of an API method and what happens when called requesting XML, or 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;
        }
    }
}

}

Sample:Help page display

Solution 4

Try this ApiController.Ok.

You just do return Ok(model) and change the return type to IHttpActionResult.

Example:

public class CarController : ApiController
{
    [System.Web.Mvc.Route("api/Player/videos")]
    public IHttpActionResult GetVideoMappings()
    {
        var model = new MyCarModel();
        return Ok(model);
    }
}
Share:
84,657
cool breeze
Author by

cool breeze

nice breeze.

Updated on April 26, 2021

Comments

  • cool breeze
    cool breeze about 3 years

    Currently, my ApiControllers are returning XML as a response, but for a single method, I want to return JSON. i.e. I can't make a global change to force responses as JSON.

    public class CarController : ApiController
    {  
        [System.Web.Mvc.Route("api/Player/videos")]
        public HttpResponseMessage GetVideoMappings()
        {
            var model = new MyCarModel();    
            return model;
        }
    }
    

    I tried doing this, but can't seem to convert my model to a JSON string correctly:

    var jsonString = Json(model).ToString();    
    var response = this.Request.CreateResponse(HttpStatusCode.OK);
    response.Content = new StringContent(jsonString, Encoding.UTF8, "application/json");
    return response;
    
  • Sigex
    Sigex over 4 years
    This is .Net core and he is asking about ApiController within .Net Framework
  • Mohammad Ali
    Mohammad Ali about 3 years