简体   繁体   中英

Json Nested Complex Array to Web Api 2.0 Controller Action

Ok gang. I am having what seems to be a very popular but very unsolved (at least for me) problem. I have the following request body in Fiddler:

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

As you can see, I have a complex "Reservation" object that contains a nested array of "Equipment" objects as well as a complex list of key value pairs that a customer may send us which we call CustomerFields.

When I send this to my Controller's action through fiddler, the parent class comes in as expected, but the nested Equipments array and the CustomerFields objects come in null.

My headers look like this:

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

My action signature looks like:

Post([FromBody]Reservation reservation)

And each class is decorated with [JsonObjec] or [JsonProperty] respectively and I have tried removing the Json "names" from the json body as well. What do I need to do to get my fully populated object inside my controller from fiddler? Do I need to make json data adjustments? Code adjustments? Both? I'm at a complete loss. I have tried so many different permutations that listing them would be counterproductive at this point.

Thanks for your assistance in advance.

Reservation Class Definition:

[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 Definition:

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

There is almost 0% chance there is a delta between the json and the class defs as I used automation tools for both. But if you can help me figure out just the EquipmentItems array, that will be enough. Thanks again.

I think your json isn't quite correct if you're expecting that class structure. I've removed the array under EquipmentItem and changed EquipmentItems into an array:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM