Build JSON response in Web API controller Build JSON response in Web API controller json json

Build JSON response in Web API controller


So here are the changes for your post:

First, you should make your api return Json by default when you pass a text/html request (is this you are looking for?), adding this line to your WebApiConfig class:

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));

Second, I changed the code to return a real object, impersonating your response:

public class ProductApiCollection{       public ProductApi[] Products { get; set; }          public byte Status { get; set; }}public class ProductApi{    public string Name { get; set; }}

Method body:

public ProductApiCollection Get(){    var result = new ProductApiCollection();    var dbProducts = db.Products;    var apiModels = dbProducts.Select(x => new ProductApi { Name = x.Name } ).ToArray();    result.Products = apiModels;    var status = db.Status.Any() ? 1 : 0;    result.Status = status;    return result;}

This will results in the following example json:

{  "Products": [    {      "Name": "Pork"    },    {      "Name": "Beef"    },    {      "Name": "Chicken"    },    {      "Name": "Salad"    }  ],  "Status": 1}

I strongly advise you not to do manual formatting for such things, and rely on built-in and 3rd party libraries. Otherwise, you will be reinventing the things already available, tested and ready to work.


Just as raderick mentioned, you don't need to create your own custom JSON infrastructure.

public class ProductApi{    public int Id {get;set;}    public string Name { get; set; }}public class ResponseDTO{    public int Status {get;set;}    public List<ProductApi> { get; set; }}

And in your API action, return like this:

[Route("{value:int}")]public ResponseDTO GetProducts(int value){    ResponseDTO result = ...// construct response here     return result;}