在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
}
答案 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;
}