将json发布到mvc 4 WebApi控制器操作。 为什么不反序列化我的数组呢?

以下一直让我有点疯狂。 我发现了几个类似的问题,但他们没有提供解决方案。 我试图发布一个包含一些数据项的json对象。 其中一个是对象本身的列表。 这里是:

{ "ClaimType":"Trade", "ClaimedProductId":"4", "ClaimingUserId":"2", "Message":"test", "TradeOffers":[ { "OfferedProductId":"7", "OfferedQuantity":"5" }, { "OfferedProductId":"12", "OfferedQuantity":"2" } ] } 

这个jsonvalidation了。

我的控制器看起来像这样:

 public class ProductController : ApiController { [HttpPost] public void Claim(ClaimViewModel claimViewModel) { //do some amazing stuff with the data from the viewmodel. //sorry guys. This stuff is just tooo cool to be posted here for all to see //NOT ;-) } } 

我发布的ClaimViewModel看起来像这样:

 public class ClaimViewModel { public Claim.ClaimRequestTypes ClaimType { get; set; } public int ClaimedProductId { get; set; } public int ClaimingUserId { get; set; } public string Message { get; set; } public List TradeOffers { get; set; } } 

为了完整起见,这里是TradeOffer类:

 public class TradeOffer { int OfferedProductId { get; set; } int OfferedQuantity { get; set; } } 

在我开始从Javascript发布post之前,我喜欢使用Chrome RestConsole来测试这个坏男孩,所以我可以在引擎盖下看起来更好一些。 我使用以下设置发出请求:

  • 它是一个POST请求
  • BODY内容类型是“application / json”
  • 我将json作为RAW Body中的请求有效负载发送

接下来会发生什么:我的ClaimViewModel上的所有属性ClaimViewModel容易反序列化。 但是, TradeOffers属性得到实例化,当调试显示一个计数为2的列表(到目前为止很好),但此列表中的对象的值(属性OfferedProductIdOfferedQuantity )始终为0 /零(不为空!)

TradeOffer类中的属性是私有的(C#中的默认访问修饰符),这使得无法从外部设置它们。 尝试将它们public

 public class TradeOffer { public int OfferedProductId { get; set; } public int OfferedQuantity { get; set; } } 

您在TradeOffer的房产真的是私人的吗? 如果是这样,那些需要公开。

此外,

 public List TradeOffers { get; set; } 

应该

 public List TradeOffer { get; set; } 

或者您应该将名称更改为JSON集合中的复数版本