如何从 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.

http://json2csharp.com/

求助

您应该 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() };