在Web API控制器中构建JSON响应

时间:2016-03-11 09:59:51

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

在WebAPI项目中,我有一个控制器,它根据用户输入的值检查产品的状态。

让我们说他们输入“123”并且响应应该是“状态”:1,和产品列表。如果输入“321”,则“状态”为0,以及产品列表。

我的问题是,如何在WebAPI控制器中构建正确的字符串。

[Route("{value:int}")]
public string GetProducts(int value)
{
    var json = "";
    var products = db.Products;
    if (products.Any())
    {
        foreach (var s in products)
        {
            ProductApi product = new ProductApi();
            product.Name = s.Name;
            json += JsonConvert.SerializeObject(supplier);
        }
    }

    var status = db.Status;
    if (status.Any())
    {
        json += "{status:1}";
    }
    else
    {
        json += "{status:0}";
    }

    return json;
}

public class ProductApi
{
    public string Name { get; set; }
}

此外,此输出/响应是否有效?

[
    {
        "id":1,
        "name":"product name"
    },
    {
        "id":2,
        "name":"product name 2"
    },
    {
        "id":3,
        "name":"product name 3"
    }
]

{
    "status": 0
}

2 个答案:

答案 0 :(得分:35)

以下是您帖子的更改:

首先,当你传递text/html请求时,你应该默认让你的api返回Json(这是你要找的吗?),将这一行添加到WebApiConfig类:

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

其次,我更改了代码以返回一个真实的对象,冒充您的回复:

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

public class ProductApi
{
    public string Name { get; set; }
}

方法体:

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;
}

这将产生以下示例json:

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

我强烈建议您不要对这些事情进行手动格式化,并依赖内置和第三方库。否则,你将重新发明现有的东西,经过测试并准备好工作。

答案 1 :(得分:4)

正如 raderick 所提到的,您不需要创建自己的自定义JSON基础架构。

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; }
}

在您的API操作中,请按以下方式返回:

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

    return result;
}