2017-04-01 1 views
0

Ok gang. J'ai ce qui semble être un problème très populaire mais très non résolu (au moins pour moi). J'ai le corps de la requête suivante dans Fiddler:JSON Complexe complexe imbriqué vers le contrôleur Web Api 2.0 Action

{ 
    "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" 
    } 
    } 

Comme vous pouvez le voir, j'ai un objet « Réservation » complexe qui contient un tableau imbriqué d'objets « d'équipement » ainsi qu'une liste complexe de paires de valeurs clés un client peut nous envoyer ce que nous appelons CustomerFields.

Lorsque j'envoie ceci à l'action de mon Controller via fiddler, la classe parente arrive comme prévu, mais le tableau Equipments imbriqué et les objets CustomerFields sont null.

Mes têtes ressemblent à ceci:

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

Ma signature d'action ressemble à:

Post([FromBody]Reservation reservation) 

Et chaque classe est décorée avec [JsonObjec] ou [JsonProperty], respectivement, et je l'ai essayé d'enlever la Json "noms" du corps json aussi bien. Que dois-je faire pour obtenir mon objet entièrement peuplé dans mon contrôleur de violoneux? Ai-je besoin de faire des ajustements de données JSON? Ajustements de code? Tous les deux? Je suis complètement perdu. J'ai essayé tellement de permutations différentes que leur énumération serait contre-productive à ce stade.

Merci de votre aide à l'avance.

Réservation Classe Définition:

[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 Définition:

[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 
    } 

Il y a presque 0% de chance il y a un delta entre le JSON et les defs de classe comme je l'ai utilisé des outils d'automatisation pour les deux. Mais si vous pouvez m'aider à comprendre le tableau EquipmentItems, cela suffira. Merci encore.

+0

vous pourriez peut-être inclure vos classes de réservation? Dans mon expérience, cela se produit quand il y a une discordance entre les données Json et l'objet cible. – john

+0

Je note également que EquipmentItems est un objet qui contient EquiptmentItem, qui est un tableau d'objets. Est-ce exact? – john

+0

@john Oui c'est correct –

Répondre

0

Je pense que votre json n'est pas tout à fait correct si vous attendez cette structure de classe. J'ai enlevé le tableau sous EquipmentItem et EquipmentItems transformé en un tableau:

{ 
    "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

Ok, merci. Est-ce que je peux faire ce travail sans changer la définition de la classe? –

+0

@DJ Vous n'avez pas besoin de changer la définition de classe - c'était juste au cas où vous auriez d'autres problèmes, afin que vous puissiez analyser si c'est un problème avec votre classe ou non. Le json modifié devrait fonctionner avec votre classe actuelle maintenant, à moins que j'ai raté d'autres problèmes. – john

+0

Oh merci pour cette précision. J'ai essayé ton json dans un violoniste et pas de joie –