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

5

47

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;
Lido answered 2/3, 2018 at 16:48 Comment(4)
Try the return type JsonResult instead of HttpResponseMessage, then you can return a Json object, like this: return Json(model)Hinds
try this ApiController.Ok you just do return Ok(model)Isolation
@RicardoPontual is it a System.Web.Mvc.JsonResult? I'm getting a Cannot implicitly convert type 'System.Web.Http.Results.JsonResult<MyCarModel>' to 'System.Web.Mvc.JsonResult' Lido
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)Hinds
K
81

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);    
}
Kagu answered 2/3, 2018 at 17:6 Comment(0)
A
7

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.

Adventuresome answered 2/3, 2018 at 18:11 Comment(0)
I
5

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);
    }
}
Isolation answered 2/3, 2018 at 17:1 Comment(2)
This is .Net core and he is asking about ApiController within .Net FrameworkSind
@Sind no it is not learn.microsoft.com/en-us/aspnet/web-api/overview/…Isolation
B
2

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

Bianchi answered 2/3, 2018 at 20:37 Comment(0)
M
0

Maybe the issue is with WebApiConfig file. At the end of the file add these 2 lines

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

It is in Project/App_Start/WebApiConfig.cs For asp.net MVC

Monacid answered 2/3, 2018 at 17:10 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.