如何从 Web API 2 发送命名的 JSON 对象?
How to send named JSON objects from Web API 2?
目前我的网站 API 将 JSON 数据作为未命名的对象数组发送,如下所示:
[
{
"productTypeId": 1,
"productCategoryId": 4,
"name": "Provider Frame",
"memberCost": 75.00,
"providerCost": 25.00
},
{
"productTypeId": 1,
"productCategoryId": 4,
"name": "Customer Frame",
"memberCost": 0.00,
"providerCost": 0.00
},
{
"productTypeId": 1,
"productCategoryId": 4,
"name": "Fireproof Frame",
"memberCost": 75.00,
"providerCost": 25.00
}
]
有没有办法改变 API 发送这样的数据?
{
"frames": [
{
"productTypeId": 1,
"productCategoryId": 4,
"name": "Provider Frame",
"memberCost": 75.00,
"providerCost": 25.00
},
{
"productTypeId": 1,
"productCategoryId": 4,
"name": "Customer Frame",
"memberCost": 0.00,
"providerCost": 0.00
},
{
"productTypeId": 1,
"productCategoryId": 4,
"name": "Fireproof Frame",
"memberCost": 75.00,
"providerCost": 25.00
}
]
}
我想让我的前端框架能够按名称读取 JSON 对象,而不是假设它是 "data"。这有意义吗?
这是网络代码 API:
public sealed class FramesController : ApiController
{
private readonly IProductService prodSvc;
public FramesController(IProductService _prodSvc)
{
prodSvc = _prodSvc;
}
public IEnumerable<Product> GetFrames(int productTypeId)
{
return prodSvc.GetProductsByCategoryId((int)Enums.CategoryGroup.Frame, productTypeId);
}
}
用 class 包裹你的响应类型,并给它一个名为 "frames" 的数组 属性,其框架类型为 class.
求助
您应该 return YourResponse class 的实例,如下所示:
public class Frame
{
public int productTypeId { get; set; }
public int productCategoryId { get; set; }
public string name { get; set; }
public double memberCost { get; set; }
public double providerCost { get; set; }
}
public class YourResponse
{
public List<Frame> frames { get; set; }
}
您可以使用 ExpandoObject:
dynamic data = new ExpandoObject();
data.frames = yourObject;
return Json(data);
将操作更新为 return 封装在具有所需 属性 名称的对象中的数据
public sealed class FramesController : ApiController {
private readonly IProductService prodSvc;
public FramesController(IProductService _prodSvc) {
prodSvc = _prodSvc;
}
public IHttpActionResult GetFrames(int productTypeId) {
var products = prodSvc.GetProductsByCategoryId((int)Enums.CategoryGroup.Frame, productTypeId);
if(!products.Any())
return NotFound();
var result = new { frames = products.ToArray() };
return Ok(result);
}
}
上面的例子使用了匿名类型,但也可以很容易地使用像
这样的具体类型
public class GetFramesResult {
public Product[] frames { get; set; }
}
并在动作中使用
var result = new GetFramesResult { frames = products.ToArray() };
目前我的网站 API 将 JSON 数据作为未命名的对象数组发送,如下所示:
[
{
"productTypeId": 1,
"productCategoryId": 4,
"name": "Provider Frame",
"memberCost": 75.00,
"providerCost": 25.00
},
{
"productTypeId": 1,
"productCategoryId": 4,
"name": "Customer Frame",
"memberCost": 0.00,
"providerCost": 0.00
},
{
"productTypeId": 1,
"productCategoryId": 4,
"name": "Fireproof Frame",
"memberCost": 75.00,
"providerCost": 25.00
}
]
有没有办法改变 API 发送这样的数据?
{
"frames": [
{
"productTypeId": 1,
"productCategoryId": 4,
"name": "Provider Frame",
"memberCost": 75.00,
"providerCost": 25.00
},
{
"productTypeId": 1,
"productCategoryId": 4,
"name": "Customer Frame",
"memberCost": 0.00,
"providerCost": 0.00
},
{
"productTypeId": 1,
"productCategoryId": 4,
"name": "Fireproof Frame",
"memberCost": 75.00,
"providerCost": 25.00
}
]
}
我想让我的前端框架能够按名称读取 JSON 对象,而不是假设它是 "data"。这有意义吗?
这是网络代码 API:
public sealed class FramesController : ApiController
{
private readonly IProductService prodSvc;
public FramesController(IProductService _prodSvc)
{
prodSvc = _prodSvc;
}
public IEnumerable<Product> GetFrames(int productTypeId)
{
return prodSvc.GetProductsByCategoryId((int)Enums.CategoryGroup.Frame, productTypeId);
}
}
用 class 包裹你的响应类型,并给它一个名为 "frames" 的数组 属性,其框架类型为 class.
求助您应该 return YourResponse class 的实例,如下所示:
public class Frame
{
public int productTypeId { get; set; }
public int productCategoryId { get; set; }
public string name { get; set; }
public double memberCost { get; set; }
public double providerCost { get; set; }
}
public class YourResponse
{
public List<Frame> frames { get; set; }
}
您可以使用 ExpandoObject:
dynamic data = new ExpandoObject();
data.frames = yourObject;
return Json(data);
将操作更新为 return 封装在具有所需 属性 名称的对象中的数据
public sealed class FramesController : ApiController {
private readonly IProductService prodSvc;
public FramesController(IProductService _prodSvc) {
prodSvc = _prodSvc;
}
public IHttpActionResult GetFrames(int productTypeId) {
var products = prodSvc.GetProductsByCategoryId((int)Enums.CategoryGroup.Frame, productTypeId);
if(!products.Any())
return NotFound();
var result = new { frames = products.ToArray() };
return Ok(result);
}
}
上面的例子使用了匿名类型,但也可以很容易地使用像
这样的具体类型public class GetFramesResult {
public Product[] frames { get; set; }
}
并在动作中使用
var result = new GetFramesResult { frames = products.ToArray() };