2017-04-01 93 views
0

好的团伙。我似乎是一个非常受欢迎但很难解决的问题(至少对我而言)。我有以下要求身体提琴手:Json嵌套复杂数组到Web Api 2.0控制器操作

{ 
    "Type": "WQ", 
    "Customer": "1600", 
    "JobNbr": "1zAlpha - BLAHDYBLOO", 
    "Delivery": 1, 
    "Pickup": 1, 
    "DelInst": "Location: Earth 
    ", 
    "StartDate": "2017-02-28", 
    "StartTime": "1700", 
    "EndDate": "2017-03-15", 
    "EndTime": "1700", 
    "CustTransactionId": "555", 
"EquipmentItems": { 
    "EquipmentItem": 
[ 
     { 
      "Equipment": "0500006", 
      "CatID": "050", 
      "ClassID": "0006", 
      "LineSeq": "1", 
      "Quantity": "001" 
     }, 
     { 
      "Equipment": "0500007", 
      "CatID": "050", 
      "ClassID": "0007", 
      "LineSeq": "2", 
      "Quantity": "001" 
     } 
     ]}, 
    "CustomerFields": { 
     "blah": "12345", 
     "blah blah": "123", 
     "blah blah blah": "WHATEVER" 
    } 
    } 

正如你所看到的,我有一个包含“设备”对象的嵌套数组一个复杂的“保留”对象以及键值对的复杂列表客户可能会向我们发送我们称之为CustomerFields的消息。

当我通过fiddler将此发送给Controller的操作时,父类按预期进入,但嵌套的Equipments数组和CustomerFields对象为空。

我的头看起来像这样:

Content-Type: application/json; charset=utf-8 
Accept: application/json, text/javascript, /; q=0.01 
Host: localhost:51493 
Content-Length: 1209 

我的行动的签名是这样的:

Post([FromBody]Reservation reservation) 

而且每一类都装饰着[JsonObjec]或分别为[JsonProperty]我已经试图消除Json的“名字”也来自json主体。我需要做什么来让我的控制器里的完全填充的对象从fiddler中获取?我是否需要进行json数据调整?代码调整?都?我完全丧失了。我尝试了很多不同的排列方式,列出它们在这一点上会适得其反。

感谢您的帮助提前。

订座舱位定义:

[JsonObject] 
    public partial class Reservation : IReservation 
    { 
     #region private fields   
     private string companyField; 
     private int? locationField; 
     private ReservationType typeField; 
     private string customerField; 
     private string custTransactionIDField; 
     private Guid sbrTransactionIDField; 
     private string licenseField; 
     private string dlStateField; 
     private string jobNbrField; 
     private bool deliveryField; 
     private bool pickupField; 
     private string deliveryInstructionsField; 
     private DateTime startDateField; 
     private DateTime endDateField; 
     private string customerPOField; 
     private string webUserField; 
     private bool rPPFlagField; 
     private bool fuelFlagField; 
     private decimal deliveryChargeField; 
     private decimal pickupChargeField; 
     private CustomerDataList customerDataField; 
     private EquipmentItems itemsField; 
     #endregion 

     #region Public properties 
     /// <remarks/> 
     public int? ReservationNo { get; set; } 

     /// <remarks/> 
     public string Company 
     { 
      get 
      { 
       return this.companyField; 
      } 
      set 
      { 
       this.companyField = value; 
      } 
     } 

     /// <remarks/> 
     public int? Location 
     { 
      get 
      { 
       return this.locationField; 
      } 
      set 
      { 
       this.locationField = (value != null) ? value : -1; 
      } 
     } 

     /// <remarks/> 
     public ReservationType Type 
     { 
      get 
      { 
       return this.typeField; 
      } 
      set 
      { 
       this.typeField = value; 
      } 
     } 

     /// <remarks/> 
     public string Customer 
     { 
      get 
      { 
       return this.customerField; 
      } 
      set 
      { 
       this.customerField = value; 
      } 
     } 

     /// <remarks/> 
     public string CustTransactionID 
     { 
      get 
      { 
       return this.custTransactionIDField != null ? custTransactionIDField : string.Empty;    
      } 

      set 
      { 
       this.custTransactionIDField = value; 
      } 
     } 

     /// <remarks/> 
     public Guid SBRTransactionID 
     { 
      get 
      { 
       return this.sbrTransactionIDField; 
      } 

      set 
      { 
       this.sbrTransactionIDField = value; 
      } 
     } 

     /// <remarks/> 
     public string License 
     { 
      get 
      { 
       return this.licenseField; 
      } 
      set 
      { 
       this.licenseField = value; 
      } 
     } 

     /// <remarks/> 
     public string DlState 
     { 
      get 
      { 
       return this.dlStateField; 
      } 
      set 
      { 
       this.dlStateField = value; 
      } 
     } 

     /// <remarks/> 
     public string JobNbr 
     { 
      get 
      { 
       return this.jobNbrField; 
      } 
      set 
      { 
       this.jobNbrField = value; 
      } 
     } 

     /// <remarks/> 
     public bool Delivery 
     { 
      get 
      { 
       return this.deliveryField; 
      } 
      set 
      { 
       this.deliveryField = value; 
      } 
     } 

     public bool Pickup 
     { 
      get 
      { 
       return this.pickupField; 
      } 
      set 
      { 
       this.pickupField = value; 
      } 
     } 

     /// <remarks/> 
     public string DeliveryInstructions 
     { 
      get 
      { 
       return this.deliveryInstructionsField; 
      } 
      set 
      { 
       this.deliveryInstructionsField = value; 
      } 
     } 

     /// <remarks/> 
     public System.DateTime StartDate 
     { 
      get 
      { 
       return this.startDateField; 
      } 
      set 
      { 
       this.startDateField = value; 
      } 
     } 

     public string StartTime { get; set; } 
     public string EndTime { get; set; } 
     /// <remarks/> 
     public System.DateTime EndDate 
     { 
      get 
      { 
       return this.endDateField; 
      } 
      set 
      { 
       this.endDateField = value; 
      } 
     } 

     /// <remarks/> 
     public string CustomerPO 
     { 
      get 
      { 
       return this.customerPOField; 
      } 
      set 
      { 
       this.customerPOField = value; 
      } 
     } 

     /// <remarks/> 
     public string WebUser 
     { 
      get 
      { 
       return this.webUserField; 
      } 
      set 
      { 
       this.webUserField = value; 
      } 
     } 

     /// <remarks/> 
     public bool RPPFlag 
     { 
      get 
      { 
       return this.rPPFlagField; 
      } 
      set 
      { 
       this.rPPFlagField = value; 
      } 
     } 

     /// <remarks/> 
     public bool FuelFlag 
     { 
      get 
      { 
       return this.fuelFlagField; 
      } 
      set 
      { 
       this.fuelFlagField = value; 
      } 
     } 

     /// <remarks/> 
     public decimal DeliveryCharge 
     { 
      get 
      { 
       return this.deliveryChargeField; 
      } 
      set 
      { 
       this.deliveryChargeField = value; 
      } 
     } 

     /// <remarks/> 
     public decimal PickupCharge 
     { 
      get 
      { 
       return this.pickupChargeField; 
      } 
      set 
      { 
       this.pickupChargeField = value; 
      } 
     } 

     [System.Xml.Serialization.XmlArrayItemAttribute("EquipmentItems", IsNullable = false)] 
     [JsonProperty] 
     public EquipmentItems Items 
     { 
      get 
      { 
       return this.itemsField; 
      } 
      set 
      { 
       this.itemsField = value; 
      } 
     } 

     /// <remarks/> 
     public CustomerDataList CustomerData 
     { 
      get 
      { 
       return this.customerDataField; 
      } 
      set 
      { 
       this.customerDataField = value; 
      } 
     } 

     List<IItemData> IReservation.Items 
     { 
      get 
      { 
       return this.itemsField.ToList<IItemData>(); 
      } 

      set 
      { 
       SetItems(value); 
      } 
     } 
     /// <remarks/> 
     #endregion 

     private void SetItems(List<IItemData> items) 
     {    

      this.itemsField = ((EquipmentItems)((IEnumerable<EquipmentItem>)items.Select(e => e.CatID == e.CatID))); 


     } 
    } 
    #endregion 

EquipmentItems定义:

[JsonObject] 
public partial class EquipmentItems : List<EquipmentItem> 
{ } 

[JsonObject] 

    public partial class EquipmentItem : IItemData 
    { 
     #region Private fields 
     private string equipmentIDField; 
     private string catIDField; 
     private string classIDField; 
     private string lineSequenceField; 
     private string quantityField; 
     private string toolFlexField; 
     private string hourlyRateField; 
     private string dailyRateField; 
     private string weeklyRateField; 
     private string monthlyRateField; 
     private string minRateField; 
     private bool daysOverField; 
     private bool weeksOverField; 
     private bool monthsOverField; 
     #endregion 

     #region Public properties 
     /// <remarks/> 
     public string Equipment 
     { 
      get 
      { 
       return this.equipmentIDField; 
      } 
      set 
      { 
       this.equipmentIDField = value; 
      } 
     } 

     /// <remarks/> 
     public string CatID 
     { 
      get 
      { 
       return this.catIDField; 
      } 
      set 
      { 
       this.catIDField = value; 
      } 
     } 

     /// <remarks/> 
     public string ClassID 
     { 
      get 
      { 
       return this.classIDField; 
      } 
      set 
      { 
       this.classIDField = value; 
      } 
     } 

     /// <remarks/> 
     public string LineSeq 
     { 
      get 
      { 
       return this.lineSequenceField; 
      } 
      set 
      { 
       this.lineSequenceField = value; 
      } 
     } 

     /// <remarks/> 
     public string Quantity 
     { 
      get 
      { 
       return this.quantityField; 
      } 
      set 
      { 
       this.quantityField = value; 
      } 
     } 

     /// <remarks/> 
     public string ToolFlex 
     { 
      get 
      { 
       return this.toolFlexField; 
      } 
      set 
      { 
       this.toolFlexField = value; 
      } 
     } 

     /// <remarks/> 
     public string HrRate 
     { 
      get 
      { 
       return this.hourlyRateField; 
      } 
      set 
      { 
       this.hourlyRateField = value; 
      } 
     } 

     /// <remarks/> 
     public string DayRate 
     { 
      get 
      { 
       return this.dailyRateField; 
      } 
      set 
      { 
       this.dailyRateField = value; 
      } 
     } 

     /// <remarks/> 
     public string WkRate 
     { 
      get 
      { 
       return this.weeklyRateField; 
      } 
      set 
      { 
       this.weeklyRateField = value; 
      } 
     } 

     public string MinRate 
     { 
      get 
      { 
       return this.minRateField; 
      } 
      set 
      { 
       this.minRateField = value; 
      } 
     } 
     /// <remarks/> 
     public string MoRate 
     { 
      get 
      { 
       return this.monthlyRateField; 
      } 
      set 
      { 
       this.monthlyRateField = value; 
      } 
     } 

     /// <remarks/> 
     public bool DayOver 
     { 
      get 
      { 
       return this.daysOverField; 
      } 
      set 
      { 
       this.daysOverField = value; 
      } 
     } 

     /// <remarks/> 
     public bool WkOver 
     { 
      get 
      { 
       return this.weeksOverField; 
      } 
      set 
      { 
       this.weeksOverField = value; 
      } 
     } 

     /// <remarks/> 
     public bool MoOver 
     { 
      get 
      { 
       return this.monthsOverField; 
      } 
      set 
      { 
       this.monthsOverField = value; 
      } 
     } 
     #endregion 
    } 

有几乎为0%的几率存在JSON和为我所用自动化工具的两个类DEFS之间的增量。但是如果你能帮我弄清楚EquipmentItems数组,那就足够了。再次感谢。

+0

也许你可以包括你的预约课程?根据我的经验,这发生在Json数据和目标对象之间不匹配时。 – john

+0

我还注意到EquipmentItems是一个包含EquiptmentItem的对象,它是一个对象数组。那是对的吗? – john

+0

@john是的,这是正确的 –

回答

0

我想你的json并不完全正确,如果你期待的是类结构。我已经删除EquipmentItem和改变EquipmentItems下数组的数组:

{ 
    "Type": "WQ", 
    "Customer": "1600", 
    "JobNbr": "1zAlpha - BLAHDYBLOO", 
    "Delivery": 1, 
    "Pickup": 1, 
    "DelInst": "Location: Earth 
      ", 
    "StartDate": "2017-02-28", 
    "StartTime": "1700", 
    "EndDate": "2017-03-15", 
    "EndTime": "1700", 
    "CustTransactionId": "555", 
    "EquipmentItems": [{ 
      "Equipment": "0500006", 
      "CatID": "050", 
      "ClassID": "0006", 
      "LineSeq": "1", 
      "Quantity": "001" 
     }, { 
      "Equipment": "0500007", 
      "CatID": "050", 
      "ClassID": "0007", 
      "LineSeq": "2", 
      "Quantity": "001" 
     } 
    ], 
    "CustomerFields": { 
     "blah": "12345", 
     "blah blah": "123", 
     "blah blah blah": "WHATEVER" 
    } 
} 

[JsonObject] 
public partial class Reservation : IReservation 
{ 
    #region private fields   
    private string companyField; 
    private int? locationField; 
    private ReservationType typeField; 
    private string customerField; 
    private string custTransactionIDField; 
    private Guid sbrTransactionIDField; 
    private string licenseField; 
    private string dlStateField; 
    private string jobNbrField; 
    private bool deliveryField; 
    private bool pickupField; 
    private string deliveryInstructionsField; 
    private DateTime startDateField; 
    private DateTime endDateField; 
    private string customerPOField; 
    private string webUserField; 
    private bool rPPFlagField; 
    private bool fuelFlagField; 
    private decimal deliveryChargeField; 
    private decimal pickupChargeField; 
    private CustomerDataList customerDataField; 
    private List<EquipmentItem> itemsField; 
    #endregion 

    #region Public properties 
    /// <remarks/> 
    public int? ReservationNo { get; set; } 

    /// <remarks/> 
    public string Company 
    { 
     get 
     { 
      return this.companyField; 
     } 
     set 
     { 
      this.companyField = value; 
     } 
    } 

    /// <remarks/> 
    public int? Location 
    { 
     get 
     { 
      return this.locationField; 
     } 
     set 
     { 
      this.locationField = (value != null) ? value : -1; 
     } 
    } 

    /// <remarks/> 
    public ReservationType Type 
    { 
     get 
     { 
      return this.typeField; 
     } 
     set 
     { 
      this.typeField = value; 
     } 
    } 

    /// <remarks/> 
    public string Customer 
    { 
     get 
     { 
      return this.customerField; 
     } 
     set 
     { 
      this.customerField = value; 
     } 
    } 

    /// <remarks/> 
    public string CustTransactionID 
    { 
     get 
     { 
      return this.custTransactionIDField != null ? custTransactionIDField : string.Empty;    
     } 

     set 
     { 
      this.custTransactionIDField = value; 
     } 
    } 

    /// <remarks/> 
    public Guid SBRTransactionID 
    { 
     get 
     { 
      return this.sbrTransactionIDField; 
     } 

     set 
     { 
      this.sbrTransactionIDField = value; 
     } 
    } 

    /// <remarks/> 
    public string License 
    { 
     get 
     { 
      return this.licenseField; 
     } 
     set 
     { 
      this.licenseField = value; 
     } 
    } 

    /// <remarks/> 
    public string DlState 
    { 
     get 
     { 
      return this.dlStateField; 
     } 
     set 
     { 
      this.dlStateField = value; 
     } 
    } 

    /// <remarks/> 
    public string JobNbr 
    { 
     get 
     { 
      return this.jobNbrField; 
     } 
     set 
     { 
      this.jobNbrField = value; 
     } 
    } 

    /// <remarks/> 
    public bool Delivery 
    { 
     get 
     { 
      return this.deliveryField; 
     } 
     set 
     { 
      this.deliveryField = value; 
     } 
    } 

    public bool Pickup 
    { 
     get 
     { 
      return this.pickupField; 
     } 
     set 
     { 
      this.pickupField = value; 
     } 
    } 

    /// <remarks/> 
    public string DeliveryInstructions 
    { 
     get 
     { 
      return this.deliveryInstructionsField; 
     } 
     set 
     { 
      this.deliveryInstructionsField = value; 
     } 
    } 

    /// <remarks/> 
    public System.DateTime StartDate 
    { 
     get 
     { 
      return this.startDateField; 
     } 
     set 
     { 
      this.startDateField = value; 
     } 
    } 

    public string StartTime { get; set; } 
    public string EndTime { get; set; } 
    /// <remarks/> 
    public System.DateTime EndDate 
    { 
     get 
     { 
      return this.endDateField; 
     } 
     set 
     { 
      this.endDateField = value; 
     } 
    } 

    /// <remarks/> 
    public string CustomerPO 
    { 
     get 
     { 
      return this.customerPOField; 
     } 
     set 
     { 
      this.customerPOField = value; 
     } 
    } 

    /// <remarks/> 
    public string WebUser 
    { 
     get 
     { 
      return this.webUserField; 
     } 
     set 
     { 
      this.webUserField = value; 
     } 
    } 

    /// <remarks/> 
    public bool RPPFlag 
    { 
     get 
     { 
      return this.rPPFlagField; 
     } 
     set 
     { 
      this.rPPFlagField = value; 
     } 
    } 

    /// <remarks/> 
    public bool FuelFlag 
    { 
     get 
     { 
      return this.fuelFlagField; 
     } 
     set 
     { 
      this.fuelFlagField = value; 
     } 
    } 

    /// <remarks/> 
    public decimal DeliveryCharge 
    { 
     get 
     { 
      return this.deliveryChargeField; 
     } 
     set 
     { 
      this.deliveryChargeField = value; 
     } 
    } 

    /// <remarks/> 
    public decimal PickupCharge 
    { 
     get 
     { 
      return this.pickupChargeField; 
     } 
     set 
     { 
      this.pickupChargeField = value; 
     } 
    } 

    [System.Xml.Serialization.XmlArrayItemAttribute("EquipmentItems", IsNullable = false)] 
    [JsonProperty(PropertyName = "EquipmentItems")] 
    public List<EquipmentItem> Items 
    { 
     get 
     { 
      return this.itemsField; 
     } 
     set 
     { 
      this.itemsField = value; 
     } 
    } 

    /// <remarks/> 
    public CustomerDataList CustomerData 
    { 
     get 
     { 
      return this.customerDataField; 
     } 
     set 
     { 
      this.customerDataField = value; 
     } 
    } 

    List<IItemData> IReservation.Items 
    { 
     get 
     { 
      return this.itemsField.ToList<IItemData>(); 
     } 

     set 
     { 
      SetItems(value); 
     } 
    } 
    /// <remarks/> 
    #endregion 

    private void SetItems(List<IItemData> items) 
    {    

     this.itemsField = ((List<EquipmentItem>)((IEnumerable<EquipmentItem>)items.Select(e => e.CatID == e.CatID))); 


    } 
} 
#endregion 



[JsonObject] 

public partial class EquipmentItem : IItemData 
{ 
    #region Private fields 
    private string equipmentIDField; 
    private string catIDField; 
    private string classIDField; 
    private string lineSequenceField; 
    private string quantityField; 
    private string toolFlexField; 
    private string hourlyRateField; 
    private string dailyRateField; 
    private string weeklyRateField; 
    private string monthlyRateField; 
    private string minRateField; 
    private bool daysOverField; 
    private bool weeksOverField; 
    private bool monthsOverField; 
    #endregion 

    #region Public properties 
    /// <remarks/> 
    public string Equipment 
    { 
     get 
     { 
      return this.equipmentIDField; 
     } 
     set 
     { 
      this.equipmentIDField = value; 
     } 
    } 

    /// <remarks/> 
    public string CatID 
    { 
     get 
     { 
      return this.catIDField; 
     } 
     set 
     { 
      this.catIDField = value; 
     } 
    } 

    /// <remarks/> 
    public string ClassID 
    { 
     get 
     { 
      return this.classIDField; 
     } 
     set 
     { 
      this.classIDField = value; 
     } 
    } 

    /// <remarks/> 
    public string LineSeq 
    { 
     get 
     { 
      return this.lineSequenceField; 
     } 
     set 
     { 
      this.lineSequenceField = value; 
     } 
    } 

    /// <remarks/> 
    public string Quantity 
    { 
     get 
     { 
      return this.quantityField; 
     } 
     set 
     { 
      this.quantityField = value; 
     } 
    } 

    /// <remarks/> 
    public string ToolFlex 
    { 
     get 
     { 
      return this.toolFlexField; 
     } 
     set 
     { 
      this.toolFlexField = value; 
     } 
    } 

    /// <remarks/> 
    public string HrRate 
    { 
     get 
     { 
      return this.hourlyRateField; 
     } 
     set 
     { 
      this.hourlyRateField = value; 
     } 
    } 

    /// <remarks/> 
    public string DayRate 
    { 
     get 
     { 
      return this.dailyRateField; 
     } 
     set 
     { 
      this.dailyRateField = value; 
     } 
    } 

    /// <remarks/> 
    public string WkRate 
    { 
     get 
     { 
      return this.weeklyRateField; 
     } 
     set 
     { 
      this.weeklyRateField = value; 
     } 
    } 

    public string MinRate 
    { 
     get 
     { 
      return this.minRateField; 
     } 
     set 
     { 
      this.minRateField = value; 
     } 
    } 
    /// <remarks/> 
    public string MoRate 
    { 
     get 
     { 
      return this.monthlyRateField; 
     } 
     set 
     { 
      this.monthlyRateField = value; 
     } 
    } 

    /// <remarks/> 
    public bool DayOver 
    { 
     get 
     { 
      return this.daysOverField; 
     } 
     set 
     { 
      this.daysOverField = value; 
     } 
    } 

    /// <remarks/> 
    public bool WkOver 
    { 
     get 
     { 
      return this.weeksOverField; 
     } 
     set 
     { 
      this.weeksOverField = value; 
     } 
    } 

    /// <remarks/> 
    public bool MoOver 
    { 
     get 
     { 
      return this.monthsOverField; 
     } 
     set 
     { 
      this.monthsOverField = value; 
     } 
    } 
    #endregion 
} 
+0

好的,谢谢。有什么方法可以在不更改类定义的情况下完成这项工作? –

+0

@DJ您不必更改类定义 - 这是为了防止您有任何其他问题,以便您可以分析它是否与您的课程有关。改变后的json现在应该和你现在的课程一起工作,除非我错过了其他问题。 – john

+0

哦,谢谢你的澄清。我确实尝试过你的小提琴手json并且没有快乐 –