Как вернуть JSON в 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 ответов

Решение

Если вы не можете сделать глобальное изменение, чтобы заставить ответы как 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);    

    }

Вместо json возвращается xml, поскольку вызывающая сторона запрашивает 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, что и любой другой метод.

Попробуйте этот 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);
    }

}

Для контроллеров 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;
        }
    }
}

}

Образец: Отображение страницы справки

Возможно, проблема связана с файлом WebApiConfig. В конце файла добавьте эти 2 строки

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

Другие вопросы по тегам