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.
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
Je note également que EquipmentItems est un objet qui contient EquiptmentItem, qui est un tableau d'objets. Est-ce exact? – john
@john Oui c'est correct –