I am using RestSharp
in my MVC
project. I have these two classes to use as Models
for the API Data.
public class ApiResponseON
{
public Data Data { get; set; }
}
public class Data
{
public string? comments { get; set; }
}
and I'm hitting the API to return data like this
public async Task<List<ApiResponseON>> GetJson(string on
{
RestRequest restRequest = new RestRequest($"/search?filter.on={on}&filter.status=All");
var data = await _restClient.GetAsync<List<ApiResponseON>>(restRequest);
return data;
}
but my issue is that I am getting this error on the return data;
line
System.InvalidCastException: 'Unable to cast object of type 'RestSharp.JsonArray' to type 'System.Collections.Generic.IDictionary`2[System.String,System.Object]'.'
What do I need to change in the code so this executes successfully?
Raw Json
{
"TotalRecords":1,
"Skip":0,
"Take":100,
"ReturnCode":"Success",
"Data":[
{
"OrderUser":{
"Email":"",
"FullName":"",
"Username":"",
"FirstName":"",
"LastName":"",
"ExternalId":"",
"Custom01":"",
"Custom02":"",
"Custom03":"",
"UserGroupName":""
},
"OrderNumber":"",
"CurrencyCode":"USD",
"OrderTag":null,
"PoNumber":"",
"Comments":"4321",
"CompanyName":"",
"CompanyGuid":"00000000-0000-0000-0000-000000000000",
"CompanyId":2295,
"OrderStatus":"Active",
"AccountingUnit":null,
"EmailAddress":"",
"ShippinndHandling":0,
"Tax":0,
"Discount":0,
"OrderDate":"2017-10-28T12:16:30.453",
"ClosedDate":null,
"DesiredShipDate":"2017-11-03T23:59:59",
"Carrier":"Flat Rate",
"Shippinddress":{
"Company":"",
"Name":"",
"AddressLine1":"",
"AddressLine2":"",
"AddressLine3":"",
"City":"",
"State":"",
"Country":"US",
"ZipCode":"",
"PhoneNumber":"",
"ExternalId":null,
"Email":"",
"ShipmentCode":null
},
"Billinddress":{
"Company":"",
"Name":"",
"AddressLine1":"",
"AddressLine2":"",
"AddressLine3":null,
"City":"",
"State":"",
"Country":"US",
"ZipCode":"",
"PhoneNumber":"",
"ExternalId":null,
"Email":null,
"ShipmentCode":null
},
"Lines":[
{
"LineNumber":1,
"LineId":"",
"ApprovalReason":null,
"Price":0,
"DirectMailService":null,
"Status":"Released",
"EstimatedShipDate":"2017-11-03T23:59:59",
"Sku":"",
"PrintFileUrl":"",
"PrintFilename":"",
"ListFilUrl":null,
"ListFilename":"",
"Quantity":1,
"FileUrl":null,
"Thumbnail":null,
"UnitPrice":0,
"Part":{
"Id":1073225,
"Name":"",
"UnitCost":0,
"MinQuantity":0,
"MinQuantity2":0,
"MaxQuantity":99999,
"DaysOfStockMin":null,
"DateAvailable":"2017-10-18T00:00:00",
"Comments":"",
"CompanyExternalId1":"",
"CompanyExternalId2":"",
"HasListVariables":false,
"SiteId":127,
"CompanyId":2295,
"IsKit":false,
"IsLimitPartOrderQuantity":false,
"IsEdeliveryOnly":false,
"IsPersonalizeable":false,
"VendorName":null,
"VendorId":null,
"ShipmentGroupId":null,
"BoxSizeId":null,
"IsConfigurable":false,
"IsFixedAsset":false,
"Options":{
"PartOptionId":1222272,
"DateUpdated":"2017-10-18T10:30:43.503",
"IsCorporateListAllowed":false,
"IsEnforceMasterConfig":false,
"IsFulfillChargeExempt":false,
"IsMailingListRequired":false,
"IsPurchaseListAllowed":false,
"IsTaxExempt":false,
"IsUploadListAllowed":false,
"IsUploadListOnly":false,
"PartId":1073225,
"IsShippingExempt":false,
"ComponentItemType":null,
"ComponentMinCount":null,
"ComponentMaxCount":null,
"AllowNetiveDemand":null,
"TaxCode":null,
"UseListQtyForKitParts":false,
"IsShowBackorderAlert":null,
"ChiliDocumentId":null,
"IsFixedAsset":false,
"FixedAssetFrontBufferDays":null,
"FixedAssetBackBufferDays":null,
"IsBulkProofing":false,
"AllowCopyCustomization":null,
"IsForcedDynamicDatasource":false,
"AllowFacebook":false,
"AllowFacebookCaption":false,
"MailingListDeduplicationType":null
},
"UnitOfMeasure":null,
"ThumbnailFile":"image-not-found.png",
"Categories":[
],
"BoxSize":null,
"SourcingZip":null,
"SourcingId":null,
"IsShippingExempt":false,
"ProductionQueue":null,
"IsBulkProofing":false,
"IsOneToOneMailing":false,
"Rating":0,
"ReviewsCount":0
},
"VendorPart":null,
"Custom01":"",
"Custom02":"",
"Custom03":"",
"VendorId":null,
"Discount":0,
"DiscountName":null,
"DiscountKey":null,
"Weight":0,
"WeightedEstimatedShipping":0,
"EDeliveryUrl":"",
"FulfillCharge":0,
"IsEDelivery":false,
"IsTaxExempt":false,
"IsFullfillExempt":false,
"IsCustomized":false,
"DeliveryMethod":null,
"AccountingUnit":null,
"AccountingUnitDetails":null,
"ProofName":null,
"ProofInitial":null,
"ProofDate":null,
"ProducingPartner":null,
"Attributes":[
],
"PrintInfo":{
"NumberOfPages":0,
"FinishedTrimWidth":0,
"FinishedTrimHeight":0,
"Duplex":null,
"Bleed":null,
"Folds":null,
"PaperStock":null,
"PressSheetSize":null,
"NumberOut":null,
"BindarySpecifications":null,
"FlatSize":null,
"ProductionPress":null
},
"ShipmentLines":[
],
"RawMaterials":[
],
"CoopBucketName":null,
"ProofComments":"",
"IsFixedAsset":"N",
"RequestedArrivalDate":null,
"ExpectedReturnDate":null
}
],
"IsEDeliveryOnly":false,
"ShowInvoiceEmail":false,
"InvoiceEmail":"",
"InvoiceFee":0,
"Total":0,
"SubTotal":0,
"TotalMailingCost":0,
"IsExpedite":false,
"PartShippingCost":null,
"OrderFiles":[
],
"ThirdPartyAccountNumber":"",
"SignatureRequired":false
}
],
"Message":null,
"ErrorGuid":null
}
CodePudding user response:
Note this model was obtained by one of many json to C# converters, you can do it in visual studio or there are free web sites.
Given
public class Rootobject
{
public int TotalRecords { get; set; }
public int Skip { get; set; }
public int Take { get; set; }
public string ReturnCode { get; set; }
public Datum[] Data { get; set; }
public object Message { get; set; }
public object ErrorGuid { get; set; }
}
public class Datum
{
public Orderuser OrderUser { get; set; }
public string OrderNumber { get; set; }
public string CurrencyCode { get; set; }
public object OrderTag { get; set; }
public string PoNumber { get; set; }
public string Comments { get; set; }
public string CompanyName { get; set; }
public string CompanyGuid { get; set; }
public int CompanyId { get; set; }
public string OrderStatus { get; set; }
public object AccountingUnit { get; set; }
public string EmailAddress { get; set; }
public int ShippinndHandling { get; set; }
public int Tax { get; set; }
public int Discount { get; set; }
public DateTime OrderDate { get; set; }
public object ClosedDate { get; set; }
public DateTime DesiredShipDate { get; set; }
public string Carrier { get; set; }
public Shippinddress Shippinddress { get; set; }
public Billinddress Billinddress { get; set; }
public Line[] Lines { get; set; }
public bool IsEDeliveryOnly { get; set; }
public bool ShowInvoiceEmail { get; set; }
public string InvoiceEmail { get; set; }
public int InvoiceFee { get; set; }
public int Total { get; set; }
public int SubTotal { get; set; }
public int TotalMailingCost { get; set; }
public bool IsExpedite { get; set; }
public object PartShippingCost { get; set; }
public object[] OrderFiles { get; set; }
public string ThirdPartyAccountNumber { get; set; }
public bool SignatureRequired { get; set; }
}
public class Orderuser
{
public string Email { get; set; }
public string FullName { get; set; }
public string Username { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string ExternalId { get; set; }
public string Custom01 { get; set; }
public string Custom02 { get; set; }
public string Custom03 { get; set; }
public string UserGroupName { get; set; }
}
public class Shippinddress
{
public string Company { get; set; }
public string Name { get; set; }
public string AddressLine1 { get; set; }
public string AddressLine2 { get; set; }
public string AddressLine3 { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Country { get; set; }
public string ZipCode { get; set; }
public string PhoneNumber { get; set; }
public object ExternalId { get; set; }
public string Email { get; set; }
public object ShipmentCode { get; set; }
}
public class Billinddress
{
public string Company { get; set; }
public string Name { get; set; }
public string AddressLine1 { get; set; }
public string AddressLine2 { get; set; }
public object AddressLine3 { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Country { get; set; }
public string ZipCode { get; set; }
public string PhoneNumber { get; set; }
public object ExternalId { get; set; }
public object Email { get; set; }
public object ShipmentCode { get; set; }
}
public class Line
{
public int LineNumber { get; set; }
public string LineId { get; set; }
public object ApprovalReason { get; set; }
public int Price { get; set; }
public object DirectMailService { get; set; }
public string Status { get; set; }
public DateTime EstimatedShipDate { get; set; }
public string Sku { get; set; }
public string PrintFileUrl { get; set; }
public string PrintFilename { get; set; }
public object ListFilUrl { get; set; }
public string ListFilename { get; set; }
public int Quantity { get; set; }
public object FileUrl { get; set; }
public object Thumbnail { get; set; }
public int UnitPrice { get; set; }
public Part Part { get; set; }
public object VendorPart { get; set; }
public string Custom01 { get; set; }
public string Custom02 { get; set; }
public string Custom03 { get; set; }
public object VendorId { get; set; }
public int Discount { get; set; }
public object DiscountName { get; set; }
public object DiscountKey { get; set; }
public int Weight { get; set; }
public int WeightedEstimatedShipping { get; set; }
public string EDeliveryUrl { get; set; }
public int FulfillCharge { get; set; }
public bool IsEDelivery { get; set; }
public bool IsTaxExempt { get; set; }
public bool IsFullfillExempt { get; set; }
public bool IsCustomized { get; set; }
public object DeliveryMethod { get; set; }
public object AccountingUnit { get; set; }
public object AccountingUnitDetails { get; set; }
public object ProofName { get; set; }
public object ProofInitial { get; set; }
public object ProofDate { get; set; }
public object ProducingPartner { get; set; }
public object[] Attributes { get; set; }
public Printinfo PrintInfo { get; set; }
public object[] ShipmentLines { get; set; }
public object[] RawMaterials { get; set; }
public object CoopBucketName { get; set; }
public string ProofComments { get; set; }
public string IsFixedAsset { get; set; }
public object RequestedArrivalDate { get; set; }
public object ExpectedReturnDate { get; set; }
}
public class Part
{
public int Id { get; set; }
public string Name { get; set; }
public int UnitCost { get; set; }
public int MinQuantity { get; set; }
public int MinQuantity2 { get; set; }
public int MaxQuantity { get; set; }
public object DaysOfStockMin { get; set; }
public DateTime DateAvailable { get; set; }
public string Comments { get; set; }
public string CompanyExternalId1 { get; set; }
public string CompanyExternalId2 { get; set; }
public bool HasListVariables { get; set; }
public int SiteId { get; set; }
public int CompanyId { get; set; }
public bool IsKit { get; set; }
public bool IsLimitPartOrderQuantity { get; set; }
public bool IsEdeliveryOnly { get; set; }
public bool IsPersonalizeable { get; set; }
public object VendorName { get; set; }
public object VendorId { get; set; }
public object ShipmentGroupId { get; set; }
public object BoxSizeId { get; set; }
public bool IsConfigurable { get; set; }
public bool IsFixedAsset { get; set; }
public Options Options { get; set; }
public object UnitOfMeasure { get; set; }
public string ThumbnailFile { get; set; }
public object[] Categories { get; set; }
public object BoxSize { get; set; }
public object SourcingZip { get; set; }
public object SourcingId { get; set; }
public bool IsShippingExempt { get; set; }
public object ProductionQueue { get; set; }
public bool IsBulkProofing { get; set; }
public bool IsOneToOneMailing { get; set; }
public int Rating { get; set; }
public int ReviewsCount { get; set; }
}
public class Options
{
public int PartOptionId { get; set; }
public DateTime DateUpdated { get; set; }
public bool IsCorporateListAllowed { get; set; }
public bool IsEnforceMasterConfig { get; set; }
public bool IsFulfillChargeExempt { get; set; }
public bool IsMailingListRequired { get; set; }
public bool IsPurchaseListAllowed { get; set; }
public bool IsTaxExempt { get; set; }
public bool IsUploadListAllowed { get; set; }
public bool IsUploadListOnly { get; set; }
public int PartId { get; set; }
public bool IsShippingExempt { get; set; }
public object ComponentItemType { get; set; }
public object ComponentMinCount { get; set; }
public object ComponentMaxCount { get; set; }
public object AllowNetiveDemand { get; set; }
public object TaxCode { get; set; }
public bool UseListQtyForKitParts { get; set; }
public object IsShowBackorderAlert { get; set; }
public object ChiliDocumentId { get; set; }
public bool IsFixedAsset { get; set; }
public object FixedAssetFrontBufferDays { get; set; }
public object FixedAssetBackBufferDays { get; set; }
public bool IsBulkProofing { get; set; }
public object AllowCopyCustomization { get; set; }
public bool IsForcedDynamicDatasource { get; set; }
public bool AllowFacebook { get; set; }
public bool AllowFacebookCaption { get; set; }
public object MailingListDeduplicationType { get; set; }
}
public class Printinfo
{
public int NumberOfPages { get; set; }
public int FinishedTrimWidth { get; set; }
public int FinishedTrimHeight { get; set; }
public object Duplex { get; set; }
public object Bleed { get; set; }
public object Folds { get; set; }
public object PaperStock { get; set; }
public object PressSheetSize { get; set; }
public object NumberOut { get; set; }
public object BindarySpecifications { get; set; }
public object FlatSize { get; set; }
public object ProductionPress { get; set; }
}
Usage
var result = _restClient.GetAsync<Rootobject>(restRequest);
Once you have your results, you can prune it how you like, ill leave that up to you, this was only to address the serialization error.