It's about the eBay API "GetOrders".
If I have more than one order in the given period of time my following code works. But if only one order is read then the "OrderArray.Order" is not an array and this gives the following exception.
Newtonsoft.Json.JsonSerializationException: 'Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'Order[]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.
To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List<T>) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object.
Path 'GetOrdersResponse.OrderArray.Order.OrderID', line 1, position 352.'
Here my Code:
GetOrdersResponseJSON orderResp = JsonConvert.DeserializeObject<GetOrdersResponseJSON>(json);
foreach (var item in orderResp.GetOrdersResponse.OrderArray.Order)
{
Console.WriteLine(item.TransactionArray.Transaction.Buyer.Email);
}
GetOrdersResponseJSON:
using E_BAY_order_importer;
using Newtonsoft.Json;
using System;
public class GetOrdersResponseJSON
{
public Xml xml { get; set; }
public Getordersresponse GetOrdersResponse { get; set; }
}
public class Xml
{
public string version { get; set; }
public string encoding { get; set; }
}
public class Getordersresponse
{
public string xmlns { get; set; }
public DateTime Timestamp { get; set; }
public string Ack { get; set; }
public string Version { get; set; }
public string Build { get; set; }
public Paginationresult PaginationResult { get; set; }
public bool HasMoreOrders { get; set; }
public Orderarray OrderArray { get; set; }
public string OrdersPerPage { get; set; }
public string PageNumber { get; set; }
public string ReturnedOrderCountActual { get; set; }
}
public class Paginationresult
{
public string TotalNumberOfPages { get; set; }
public string TotalNumberOfEntries { get; set; }
}
public class Orderarray
{
public Order[] Order { get; set; }
}
public class Order
{
public string OrderID { get; set; }
public string OrderStatus { get; set; }
public Adjustmentamount AdjustmentAmount { get; set; }
public Amountpaid AmountPaid { get; set; }
public Amountsaved AmountSaved { get; set; }
public Checkoutstatus CheckoutStatus { get; set; }
public Shippingdetails ShippingDetails { get; set; }
public DateTime CreatedTime { get; set; }
public string SellerEmail { get; set; }
public Shippingaddress ShippingAddress { get; set; }
public Shippingserviceselected ShippingServiceSelected { get; set; }
public Subtotal Subtotal { get; set; }
public Total Total { get; set; }
public string eBayCollectAndRemitTax { get; set; }
public Transactionarray TransactionArray { get; set; }
public string BuyerUserID { get; set; }
public DateTime PaidTime { get; set; }
public DateTime ShippedTime { get; set; }
public string IntegratedMerchantCreditCardEnabled { get; set; }
public string EIASToken { get; set; }
public string PaymentHoldStatus { get; set; }
public string IsMultiLegShipping { get; set; }
public string SellerUserID { get; set; }
public string SellerEIASToken { get; set; }
public string CancelStatus { get; set; }
public string ExtendedOrderID { get; set; }
public string ContainseBayPlusTransaction { get; set; }
}
public class Adjustmentamount
{
public string currencyID { get; set; }
public string text { get; set; }
}
public class Amountpaid
{
public string currencyID { get; set; }
public string text { get; set; }
}
public class Amountsaved
{
public string currencyID { get; set; }
public string text { get; set; }
}
public class Checkoutstatus
{
public string eBayPaymentStatus { get; set; }
public DateTime LastModifiedTime { get; set; }
public string PaymentMethod { get; set; }
public string Status { get; set; }
public string IntegratedMerchantCreditCardEnabled { get; set; }
public string PaymentInstrument { get; set; }
}
public class Shippingdetails
{
public Salestax SalesTax { get; set; }
public Shippingserviceoptions ShippingServiceOptions { get; set; }
public Internationalshippingserviceoption InternationalShippingServiceOption { get; set; }
public string SellingManagerSalesRecordNumber { get; set; }
public string GetItFast { get; set; }
}
public class Salestax
{
public string SalesTaxPercent { get; set; }
public string SalesTaxState { get; set; }
public string ShippingIncludedInTax { get; set; }
public Salestaxamount SalesTaxAmount { get; set; }
}
public class Salestaxamount
{
public string currencyID { get; set; }
public string text { get; set; }
}
public class Shippingserviceoptions
{
public string ShippingService { get; set; }
public Shippingservicecost ShippingServiceCost { get; set; }
public string ShippingServicePriority { get; set; }
public string ExpeditedService { get; set; }
public string ShippingTimeMin { get; set; }
public string ShippingTimeMax { get; set; }
}
public class Shippingservicecost
{
public string currencyID { get; set; }
public string text { get; set; }
}
public class Internationalshippingserviceoption
{
public string ShippingService { get; set; }
public Shippingservicecost1 ShippingServiceCost { get; set; }
public string ShippingServicePriority { get; set; }
public string[] ShipToLocation { get; set; }
}
public class Shippingservicecost1
{
public string currencyID { get; set; }
public string text { get; set; }
}
public class Shippingaddress
{
public string Name { get; set; }
public string Street1 { get; set; }
public string Street2 { get; set; }
public string CityName { get; set; }
public string StateOrProvince { get; set; }
public string Country { get; set; }
public string CountryName { get; set; }
public string Phone { get; set; }
public string PostalCode { get; set; }
public string AddressID { get; set; }
public string AddressOwner { get; set; }
public string ExternalAddressID { get; set; }
}
public class Shippingserviceselected
{
public string ShippingService { get; set; }
public Shippingservicecost2 ShippingServiceCost { get; set; }
}
public class Shippingservicecost2
{
public string currencyID { get; set; }
public string text { get; set; }
}
public class Subtotal
{
public string currencyID { get; set; }
public string text { get; set; }
}
public class Total
{
public string currencyID { get; set; }
public string text { get; set; }
}
public class Transactionarray
{
public Transaction Transaction { get; set; }
}
public class Transaction
{
public Buyer Buyer { get; set; }
public Shippingdetails1 ShippingDetails { get; set; }
public DateTime CreatedDate { get; set; }
public Item Item { get; set; }
public string QuantityPurchased { get; set; }
public Status Status { get; set; }
public string TransactionID { get; set; }
public Transactionprice TransactionPrice { get; set; }
public string eBayCollectAndRemitTax { get; set; }
public Shippingserviceselected1 ShippingServiceSelected { get; set; }
public DateTime ShippedTime { get; set; }
public string TransactionSiteID { get; set; }
public string Platform { get; set; }
public Variation Variation { get; set; }
public Taxes Taxes { get; set; }
public string OrderLineItemID { get; set; }
public string ExtendedOrderID { get; set; }
public string eBayPlusTransaction { get; set; }
public string GuaranteedShipping { get; set; }
public string GuaranteedDelivery { get; set; }
}
public class Buyer
{
public string Email { get; set; }
public string VATStatus { get; set; }
public string UserFirstName { get; set; }
public string UserLastName { get; set; }
}
public class Shippingdetails1
{
public string SellingManagerSalesRecordNumber { get; set; }
}
public class Item
{
public string ItemID { get; set; }
public string Site { get; set; }
public string Title { get; set; }
public string ConditionID { get; set; }
public string ConditionDisplayName { get; set; }
}
public class Status
{
public string PaymentHoldStatus { get; set; }
public string InquiryStatus { get; set; }
public string ReturnStatus { get; set; }
}
public class Transactionprice
{
public string currencyID { get; set; }
public string text { get; set; }
}
public class Shippingserviceselected1
{
public Shippingpackageinfo ShippingPackageInfo { get; set; }
}
public class Shippingpackageinfo
{
public DateTime EstimatedDeliveryTimeMin { get; set; }
public DateTime EstimatedDeliveryTimeMax { get; set; }
public DateTime HandleByTime { get; set; }
public DateTime MinNativeEstimatedDeliveryTime { get; set; }
public DateTime MaxNativeEstimatedDeliveryTime { get; set; }
}
public class Variation
{
public string SKU { get; set; }
public Variationspecifics VariationSpecifics { get; set; }
public string VariationTitle { get; set; }
public string VariationViewItemURL { get; set; }
}
public class Variationspecifics
{
public Namevaluelist[] NameValueList { get; set; }
}
public class Namevaluelist
{
public string Name { get; set; }
public string Value { get; set; }
}
public class Taxes
{
public Totaltaxamount TotalTaxAmount { get; set; }
public Taxdetails TaxDetails { get; set; }
}
public class Totaltaxamount
{
public string currencyID { get; set; }
public string text { get; set; }
}
public class Taxdetails
{
public string Imposition { get; set; }
public string TaxDescription { get; set; }
public Taxamount TaxAmount { get; set; }
public Taxonsubtotalamount TaxOnSubtotalAmount { get; set; }
public Taxonshippingamount TaxOnShippingAmount { get; set; }
public Taxonhandlingamount TaxOnHandlingAmount { get; set; }
}
public class Taxamount
{
public string currencyID { get; set; }
public string text { get; set; }
}
public class Taxonsubtotalamount
{
public string currencyID { get; set; }
public string text { get; set; }
}
public class Taxonshippingamount
{
public string currencyID { get; set; }
public string text { get; set; }
}
public class Taxonhandlingamount
{
public string currencyID { get; set; }
public string text { get; set; }
}
What can I do to make it work with only one order (without array) and with multiple orders (with array)? Since I would like to continue using newtonsoft json it would be nice if I get a solution with newtonsoft json!
Here is an example of the json that I get:
// One Order I get as JSON:
[...]
"OrderArray": {
"Order": {
[...]
// Multiple Orders I get as JSON:
[...]
"OrderArray": {
"Order": [
[...]
So definitely once an array and once an object!
We can use custom JSONConverter
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace RabbitMQPoc
{
public class Program
{
public static void Main(string[] args)
{
//Multiple object test
string jsonForMultipleOrder = "{\"xml\":null,\"GetOrdersResponse\":{\"xmlns\":null,\"Timestamp\":\"0001-01-01T00:00:00\",\"Ack\":null,\"Version\":null,\"Build\":null,\"PaginationResult\":null,\"HasMoreOrders\":false,\"OrderArray\":{\"Order\":[{\"OrderID\":null,\"OrderStatus\":null,\"AdjustmentAmount\":null,\"AmountPaid\":null,\"AmountSaved\":null,\"CheckoutStatus\":null,\"ShippingDetails\":null,\"CreatedTime\":\"0001-01-01T00:00:00\",\"SellerEmail\":null,\"ShippingAddress\":null,\"ShippingServiceSelected\":null,\"Subtotal\":null,\"Total\":null,\"eBayCollectAndRemitTax\":null,\"TransactionArray\":{\"Transaction\":{\"Buyer\":{\"Email\":\"sm-a\",\"VATStatus\":null,\"UserFirstName\":null,\"UserLastName\":null},\"ShippingDetails\":null,\"CreatedDate\":\"0001-01-01T00:00:00\",\"Item\":null,\"QuantityPurchased\":null,\"Status\":null,\"TransactionID\":null,\"TransactionPrice\":null,\"eBayCollectAndRemitTax\":null,\"ShippingServiceSelected\":null,\"ShippedTime\":\"0001-01-01T00:00:00\",\"TransactionSiteID\":null,\"Platform\":null,\"Variation\":null,\"Taxes\":null,\"OrderLineItemID\":null,\"ExtendedOrderID\":null,\"eBayPlusTransaction\":null,\"GuaranteedShipping\":null,\"GuaranteedDelivery\":null}},\"BuyerUserID\":null,\"PaidTime\":\"0001-01-01T00:00:00\",\"ShippedTime\":\"0001-01-01T00:00:00\",\"IntegratedMerchantCreditCardEnabled\":null,\"EIASToken\":null,\"PaymentHoldStatus\":null,\"IsMultiLegShipping\":null,\"SellerUserID\":null,\"SellerEIASToken\":null,\"CancelStatus\":null,\"ExtendedOrderID\":null,\"ContainseBayPlusTransaction\":null},{\"OrderID\":null,\"OrderStatus\":null,\"AdjustmentAmount\":null,\"AmountPaid\":null,\"AmountSaved\":null,\"CheckoutStatus\":null,\"ShippingDetails\":null,\"CreatedTime\":\"0001-01-01T00:00:00\",\"SellerEmail\":null,\"ShippingAddress\":null,\"ShippingServiceSelected\":null,\"Subtotal\":null,\"Total\":null,\"eBayCollectAndRemitTax\":null,\"TransactionArray\":{\"Transaction\":{\"Buyer\":{\"Email\":\"darshana\",\"VATStatus\":null,\"UserFirstName\":null,\"UserLastName\":null},\"ShippingDetails\":null,\"CreatedDate\":\"0001-01-01T00:00:00\",\"Item\":null,\"QuantityPurchased\":null,\"Status\":null,\"TransactionID\":null,\"TransactionPrice\":null,\"eBayCollectAndRemitTax\":null,\"ShippingServiceSelected\":null,\"ShippedTime\":\"0001-01-01T00:00:00\",\"TransactionSiteID\":null,\"Platform\":null,\"Variation\":null,\"Taxes\":null,\"OrderLineItemID\":null,\"ExtendedOrderID\":null,\"eBayPlusTransaction\":null,\"GuaranteedShipping\":null,\"GuaranteedDelivery\":null}},\"BuyerUserID\":null,\"PaidTime\":\"0001-01-01T00:00:00\",\"ShippedTime\":\"0001-01-01T00:00:00\",\"IntegratedMerchantCreditCardEnabled\":null,\"EIASToken\":null,\"PaymentHoldStatus\":null,\"IsMultiLegShipping\":null,\"SellerUserID\":null,\"SellerEIASToken\":null,\"CancelStatus\":null,\"ExtendedOrderID\":null,\"ContainseBayPlusTransaction\":null}]},\"OrdersPerPage\":null,\"PageNumber\":null,\"ReturnedOrderCountActual\":null}}";
GetOrdersResponseJSON orderResp = JsonConvert.DeserializeObject<GetOrdersResponseJSON>(jsonForMultipleOrder);
foreach (var item in orderResp.GetOrdersResponse.OrderArray.Order)
{
Console.WriteLine("From Mutiple order-> Email:" + item.TransactionArray.Transaction.Buyer.Email);
}
//Single object test
string jsonForSingleOrder = "{\"xml\":null,\"GetOrdersResponse\":{\"xmlns\":null,\"Timestamp\":\"0001-01-01T00:00:00\",\"Ack\":null,\"Version\":null,\"Build\":null,\"PaginationResult\":null,\"HasMoreOrders\":false,\"OrderArray\":{\"Order\":{\"OrderID\":null,\"OrderStatus\":null,\"AdjustmentAmount\":null,\"AmountPaid\":null,\"AmountSaved\":null,\"CheckoutStatus\":null,\"ShippingDetails\":null,\"CreatedTime\":\"0001-01-01T00:00:00\",\"SellerEmail\":null,\"ShippingAddress\":null,\"ShippingServiceSelected\":null,\"Subtotal\":null,\"Total\":null,\"eBayCollectAndRemitTax\":null,\"TransactionArray\":{\"Transaction\":{\"Buyer\":{\"Email\":\"darshana\",\"VATStatus\":null,\"UserFirstName\":null,\"UserLastName\":null},\"ShippingDetails\":null,\"CreatedDate\":\"0001-01-01T00:00:00\",\"Item\":null,\"QuantityPurchased\":null,\"Status\":null,\"TransactionID\":null,\"TransactionPrice\":null,\"eBayCollectAndRemitTax\":null,\"ShippingServiceSelected\":null,\"ShippedTime\":\"0001-01-01T00:00:00\",\"TransactionSiteID\":null,\"Platform\":null,\"Variation\":null,\"Taxes\":null,\"OrderLineItemID\":null,\"ExtendedOrderID\":null,\"eBayPlusTransaction\":null,\"GuaranteedShipping\":null,\"GuaranteedDelivery\":null}},\"BuyerUserID\":null,\"PaidTime\":\"0001-01-01T00:00:00\",\"ShippedTime\":\"0001-01-01T00:00:00\",\"IntegratedMerchantCreditCardEnabled\":null,\"EIASToken\":null,\"PaymentHoldStatus\":null,\"IsMultiLegShipping\":null,\"SellerUserID\":null,\"SellerEIASToken\":null,\"CancelStatus\":null,\"ExtendedOrderID\":null,\"ContainseBayPlusTransaction\":null}},\"OrdersPerPage\":null,\"PageNumber\":null,\"ReturnedOrderCountActual\":null}}";
GetOrdersResponseJSON ordersResponseJSONForSingleOrder = JsonConvert.DeserializeObject<GetOrdersResponseJSON>(jsonForSingleOrder);
foreach (var item in ordersResponseJSONForSingleOrder.GetOrdersResponse.OrderArray.Order)
{
Console.WriteLine("From single order-> Email:"+item.TransactionArray.Transaction.Buyer.Email);
}
}
class SingleOrArrayConverter<T> : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(List<T>));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken token = JToken.Load(reader);
if (token.Type == JTokenType.Array)
{
return token.ToObject<List<T>>();
}
return new List<T> { token.ToObject<T>() };
}
public override bool CanWrite
{
get { return false; }
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
public class GetOrdersResponseJSON
{
public Xml xml { get; set; }
public Getordersresponse GetOrdersResponse { get; set; }
}
public class Xml
{
public string version { get; set; }
public string encoding { get; set; }
}
public class Getordersresponse
{
public string xmlns { get; set; }
public DateTime Timestamp { get; set; }
public string Ack { get; set; }
public string Version { get; set; }
public string Build { get; set; }
public Paginationresult PaginationResult { get; set; }
public bool HasMoreOrders { get; set; }
public Orderarray OrderArray { get; set; }
public string OrdersPerPage { get; set; }
public string PageNumber { get; set; }
public string ReturnedOrderCountActual { get; set; }
}
public class Paginationresult
{
public string TotalNumberOfPages { get; set; }
public string TotalNumberOfEntries { get; set; }
}
public class Orderarray
{
[JsonConverter(typeof(SingleOrArrayConverter<Order>))]
public List<Order> Order { get; set; }
}
public class Order
{
public string OrderID { get; set; }
public string OrderStatus { get; set; }
public Adjustmentamount AdjustmentAmount { get; set; }
public Amountpaid AmountPaid { get; set; }
public Amountsaved AmountSaved { get; set; }
public Checkoutstatus CheckoutStatus { get; set; }
public Shippingdetails ShippingDetails { get; set; }
public DateTime CreatedTime { get; set; }
public string SellerEmail { get; set; }
public Shippingaddress ShippingAddress { get; set; }
public Shippingserviceselected ShippingServiceSelected { get; set; }
public Subtotal Subtotal { get; set; }
public Total Total { get; set; }
public string eBayCollectAndRemitTax { get; set; }
public Transactionarray TransactionArray { get; set; }
public string BuyerUserID { get; set; }
public DateTime PaidTime { get; set; }
public DateTime ShippedTime { get; set; }
public string IntegratedMerchantCreditCardEnabled { get; set; }
public string EIASToken { get; set; }
public string PaymentHoldStatus { get; set; }
public string IsMultiLegShipping { get; set; }
public string SellerUserID { get; set; }
public string SellerEIASToken { get; set; }
public string CancelStatus { get; set; }
public string ExtendedOrderID { get; set; }
public string ContainseBayPlusTransaction { get; set; }
}
public class Adjustmentamount
{
public string currencyID { get; set; }
public string text { get; set; }
}
public class Amountpaid
{
public string currencyID { get; set; }
public string text { get; set; }
}
public class Amountsaved
{
public string currencyID { get; set; }
public string text { get; set; }
}
public class Checkoutstatus
{
public string eBayPaymentStatus { get; set; }
public DateTime LastModifiedTime { get; set; }
public string PaymentMethod { get; set; }
public string Status { get; set; }
public string IntegratedMerchantCreditCardEnabled { get; set; }
public string PaymentInstrument { get; set; }
}
public class Shippingdetails
{
public Salestax SalesTax { get; set; }
public Shippingserviceoptions ShippingServiceOptions { get; set; }
public Internationalshippingserviceoption InternationalShippingServiceOption { get; set; }
public string SellingManagerSalesRecordNumber { get; set; }
public string GetItFast { get; set; }
}
public class Salestax
{
public string SalesTaxPercent { get; set; }
public string SalesTaxState { get; set; }
public string ShippingIncludedInTax { get; set; }
public Salestaxamount SalesTaxAmount { get; set; }
}
public class Salestaxamount
{
public string currencyID { get; set; }
public string text { get; set; }
}
public class Shippingserviceoptions
{
public string ShippingService { get; set; }
public Shippingservicecost ShippingServiceCost { get; set; }
public string ShippingServicePriority { get; set; }
public string ExpeditedService { get; set; }
public string ShippingTimeMin { get; set; }
public string ShippingTimeMax { get; set; }
}
public class Shippingservicecost
{
public string currencyID { get; set; }
public string text { get; set; }
}
public class Internationalshippingserviceoption
{
public string ShippingService { get; set; }
public Shippingservicecost1 ShippingServiceCost { get; set; }
public string ShippingServicePriority { get; set; }
public string[] ShipToLocation { get; set; }
}
public class Shippingservicecost1
{
public string currencyID { get; set; }
public string text { get; set; }
}
public class Shippingaddress
{
public string Name { get; set; }
public string Street1 { get; set; }
public string Street2 { get; set; }
public string CityName { get; set; }
public string StateOrProvince { get; set; }
public string Country { get; set; }
public string CountryName { get; set; }
public string Phone { get; set; }
public string PostalCode { get; set; }
public string AddressID { get; set; }
public string AddressOwner { get; set; }
public string ExternalAddressID { get; set; }
}
public class Shippingserviceselected
{
public string ShippingService { get; set; }
public Shippingservicecost2 ShippingServiceCost { get; set; }
}
public class Shippingservicecost2
{
public string currencyID { get; set; }
public string text { get; set; }
}
public class Subtotal
{
public string currencyID { get; set; }
public string text { get; set; }
}
public class Total
{
public string currencyID { get; set; }
public string text { get; set; }
}
public class Transactionarray
{
public Transaction Transaction { get; set; }
}
public class Transaction
{
public Buyer Buyer { get; set; }
public Shippingdetails1 ShippingDetails { get; set; }
public DateTime CreatedDate { get; set; }
public Item Item { get; set; }
public string QuantityPurchased { get; set; }
public Status Status { get; set; }
public string TransactionID { get; set; }
public Transactionprice TransactionPrice { get; set; }
public string eBayCollectAndRemitTax { get; set; }
public Shippingserviceselected1 ShippingServiceSelected { get; set; }
public DateTime ShippedTime { get; set; }
public string TransactionSiteID { get; set; }
public string Platform { get; set; }
public Variation Variation { get; set; }
public Taxes Taxes { get; set; }
public string OrderLineItemID { get; set; }
public string ExtendedOrderID { get; set; }
public string eBayPlusTransaction { get; set; }
public string GuaranteedShipping { get; set; }
public string GuaranteedDelivery { get; set; }
}
public class Buyer
{
public string Email { get; set; }
public string VATStatus { get; set; }
public string UserFirstName { get; set; }
public string UserLastName { get; set; }
}
public class Shippingdetails1
{
public string SellingManagerSalesRecordNumber { get; set; }
}
public class Item
{
public string ItemID { get; set; }
public string Site { get; set; }
public string Title { get; set; }
public string ConditionID { get; set; }
public string ConditionDisplayName { get; set; }
}
public class Status
{
public string PaymentHoldStatus { get; set; }
public string InquiryStatus { get; set; }
public string ReturnStatus { get; set; }
}
public class Transactionprice
{
public string currencyID { get; set; }
public string text { get; set; }
}
public class Shippingserviceselected1
{
public Shippingpackageinfo ShippingPackageInfo { get; set; }
}
public class Shippingpackageinfo
{
public DateTime EstimatedDeliveryTimeMin { get; set; }
public DateTime EstimatedDeliveryTimeMax { get; set; }
public DateTime HandleByTime { get; set; }
public DateTime MinNativeEstimatedDeliveryTime { get; set; }
public DateTime MaxNativeEstimatedDeliveryTime { get; set; }
}
public class Variation
{
public string SKU { get; set; }
public Variationspecifics VariationSpecifics { get; set; }
public string VariationTitle { get; set; }
public string VariationViewItemURL { get; set; }
}
public class Variationspecifics
{
public Namevaluelist[] NameValueList { get; set; }
}
public class Namevaluelist
{
public string Name { get; set; }
public string Value { get; set; }
}
public class Taxes
{
public Totaltaxamount TotalTaxAmount { get; set; }
public Taxdetails TaxDetails { get; set; }
}
public class Totaltaxamount
{
public string currencyID { get; set; }
public string text { get; set; }
}
public class Taxdetails
{
public string Imposition { get; set; }
public string TaxDescription { get; set; }
public Taxamount TaxAmount { get; set; }
public Taxonsubtotalamount TaxOnSubtotalAmount { get; set; }
public Taxonshippingamount TaxOnShippingAmount { get; set; }
public Taxonhandlingamount TaxOnHandlingAmount { get; set; }
}
public class Taxamount
{
public string currencyID { get; set; }
public string text { get; set; }
}
public class Taxonsubtotalamount
{
public string currencyID { get; set; }
public string text { get; set; }
}
public class Taxonshippingamount
{
public string currencyID { get; set; }
public string text { get; set; }
}
public class Taxonhandlingamount
{
public string currencyID { get; set; }
public string text { get; set; }
}
}
}
As answered here How to handle both a single item and an array for the same property using JSON.net
I have a nested json string, instead of using arrays the next level is another json structure. This creates a mess of deserializing using traditional methods.
Most other answers dealing with parsing json have clearly defined structures, and in most cases can be solved using online tools such as http://json2csharp.com/. But because this JSON doesn't use arrays properly I'm having trouble coming up with a solution to deserialize it.
For example:
{
"time":1516824466,
"global":{
"workers":1,
"hashrate":0
},
"algos":{
"scrypt-n":{
"workers":1,
"hashrate":79752.92436043094,
"hashrateString":"79.75 KH"
}
},
"pools":{
"garlicoin":{
"name":"garlicoin",
"symbol":"GRLC",
"algorithm":"scrypt-n",
"poolStats":{
"validShares":"22855",
"validBlocks":"3",
"invalidShares":"59",
"invalidRate":"0.0026",
"totalPaid":"296.42722209999999999"
},
"blocks":{
"pending":0,
"confirmed":2,
"orphaned":1
},
"workers":{
"Gf3ZXqhWKkm8qLhSHvyrawiCiooYeU9eQu":{
"shares":365.07991498000007,
"invalidshares":0,
"hashrate":79752.92436043094,
"hashrateString":"79.75 KH"
},
"Gz2Llan6hTkm8qLhSHh34awiCiooYe17heT":{
"shares":365.07991498000007,
"invalidshares":0,
"hashrate":79752.92436043094,
"hashrateString":"79.75 KH"
}
},
"hashrate":79752.92436043094,
"workerCount":1,
"hashrateString":"79.75 KH"
}
}
}
I'm having trouble deserializing these two parts specifically:
"algos":{
"scrypt-n":{
"workers":1,
"hashrate":79752.92436043094,
"hashrateString":"79.75 KH"
}
},
"workers":{
"Gf3ZXqhWKkm8qLhSHvyrawiCiooYeU9eQu":{
"shares":365.07991498000007,
"invalidshares":0,
"hashrate":79752.92436043094,
"hashrateString":"79.75 KH"
},
"Gz2Llan6hTkm8qLhSHh34awiCiooYe17heT":{
"shares":365.07991498000007,
"invalidshares":0,
"hashrate":79752.92436043094,
"hashrateString":"79.75 KH"
}
},
The Code I've Tried
namespace pooldecode
{
public static class Serialize
{
public static string ToJson(this jsonDecode.Root self)
{
return JsonConvert.SerializeObject(self, Converter.Settings);
}
}
public class Converter
{
public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
{
MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
DateParseHandling = DateParseHandling.None,
};
}
public class jsonDecode
{
public static Root FromJson(string json) => JsonConvert.DeserializeObject<Root>(json/*, Converter.Settings*/);
public partial class Root
{
[J("time")] public long Time { get; set; }
[J("global")] public Global Global { get; set; }
[J("algos")] public List<Algos> Algos { get; set; }
[J("pools")] public List<Pools> Pools { get; set; }
}
public partial class Algos
{
[J("workers")] public int Workers { get; set; }
[J("hashrate")] public double Hashrate { get; set; }
[J("hashrateString")] public string HashrateString { get; set; }
}
public partial class Global
{
[J("workers")] public int Workers { get; set; }
[J("hashrate")] public long Hashrate { get; set; }
}
public partial class Pools
{
[J("crypto")] public List<Crypto> Crypto { get; set; }
}
public partial class Crypto
{
[J("name")] public string Name { get; set; }
[J("symbol")] public string Symbol { get; set; }
[J("algorithm")] public string Algorithm { get; set; }
[J("poolStats")] public PoolStats PoolStats { get; set; }
[J("blocks")] public Blocks Blocks { get; set; }
[J("workers")] public Workers Workers { get; set; }
[J("hashrate")] public double Hashrate { get; set; }
[J("workerCount")] public long WorkerCount { get; set; }
[J("hashrateString")] public string HashrateString { get; set; }
}
public partial class Blocks
{
[J("pending")] public long Pending { get; set; }
[J("confirmed")] public long Confirmed { get; set; }
[J("orphaned")] public long Orphaned { get; set; }
}
public partial class PoolStats
{
[J("validShares")] public string ValidShares { get; set; }
[J("validBlocks")] public string ValidBlocks { get; set; }
[J("invalidShares")] public string InvalidShares { get; set; }
[J("invalidRate")] public string InvalidRate { get; set; }
[J("totalPaid")] public string TotalPaid { get; set; }
}
public partial class Workers
{
[J("worker")] public List<Workers> Worker { get; set; }
[J("shares")] public double Shares { get; set; }
[J("invalidshares")] public long Invalidshares { get; set; }
[J("hashrate")] public double Hashrate { get; set; }
[J("hashrateString")] public string HashrateString { get; set; }
}
public partial class Worker
{
[J("shares")] public double Shares { get; set; }
[J("invalidshares")] public long Invalidshares { get; set; }
[J("hashrate")] public double Hashrate { get; set; }
[J("hashrateString")] public string HashrateString { get; set; }
}
}
}
Algos, Pools and Workers have named properties as childrens, you can't deserialize them as List<T> since they are Dictionary<string, T>,
Use these classes to deserialize:
public partial class Root
{
[JsonPropertyAttribute("time")] public long Time { get; set; }
[JsonPropertyAttribute("global")] public Global Global { get; set; }
[JsonPropertyAttribute("algos")] public Dictionary<string, Algo> Algos { get; set; }
[JsonPropertyAttribute("pools")] public Dictionary<string, Pool> Pools { get; set; }
}
public partial class Global
{
[JsonPropertyAttribute("workers")] public int Workers { get; set; }
[JsonPropertyAttribute("hashrate")] public long Hashrate { get; set; }
}
public partial class Algo
{
[JsonPropertyAttribute("workers")] public int Workers { get; set; }
[JsonPropertyAttribute("hashrate")] public double Hashrate { get; set; }
[JsonPropertyAttribute("hashrateString")] public string HashrateString { get; set; }
}
public partial class Pool
{
[JsonPropertyAttribute("name")] public string Name { get; set; }
[JsonPropertyAttribute("symbol")] public string Symbol { get; set; }
[JsonPropertyAttribute("algorithm")] public string Algorithm { get; set; }
[JsonPropertyAttribute("poolStats")] public PoolStats PoolStats { get; set; }
[JsonPropertyAttribute("blocks")] public Blocks Blocks { get; set; }
[JsonPropertyAttribute("workers")] public Dictionary<string, Worker> Workers { get; set; }
[JsonPropertyAttribute("hashrate")] public double Hashrate { get; set; }
[JsonPropertyAttribute("workerCount")] public long WorkerCount { get; set; }
[JsonPropertyAttribute("hashrateString")] public string HashrateString { get; set; }
}
public partial class Blocks
{
[JsonPropertyAttribute("pending")] public long Pending { get; set; }
[JsonPropertyAttribute("confirmed")] public long Confirmed { get; set; }
[JsonPropertyAttribute("orphaned")] public long Orphaned { get; set; }
}
public partial class PoolStats
{
[JsonPropertyAttribute("validShares")] public string ValidShares { get; set; }
[JsonPropertyAttribute("validBlocks")] public string ValidBlocks { get; set; }
[JsonPropertyAttribute("invalidShares")] public string InvalidShares { get; set; }
[JsonPropertyAttribute("invalidRate")] public string InvalidRate { get; set; }
[JsonPropertyAttribute("totalPaid")] public string TotalPaid { get; set; }
}
public partial class Worker
{
[JsonPropertyAttribute("shares")] public double Shares { get; set; }
[JsonPropertyAttribute("invalidshares")] public long Invalidshares { get; set; }
[JsonPropertyAttribute("hashrate")] public double Hashrate { get; set; }
[JsonPropertyAttribute("hashrateString")] public string HashrateString { get; set; }
}
Found an odd issue when trying to deserialize a JSON string into a C# Object. It "seems" to perform the operation successfully (as in it does not throw any exception etc), however the outputted POCO contains does not contain any data from the JSON string, it only contains type default data (nulls,"", 0 etc). I have tried this process with other JSON and it works fine.
private string GetJson()
{
return #"{""backdrop_path"":"" / 1LrtAhWPSEetJLjblXvnaYtl7eA.jpg"",""created_by"":[{""id"":488,""name"":""Steven Spielberg"",""profile_path"":"" / pOK15UNaw75Bzj7BQO1ulehbPPm.jpg""},{""id"":31,""name"":""Tom Hanks"",""profile_path"":"" / a14CNByTYALAPSGlwlmfHILpEIW.jpg""}],""episode_run_time"":[60],""first_air_date"":""2001 - 09 - 09"",""genres"":[{""id"":28,""name"":""Action""},{""id"":12,""name"":""Adventure""},{""id"":18,""name"":""Drama""},{""id"":10752,""name"":""War""}],""homepage"":""http://www.hbo.com/band-of-brothers"",""id"":4613,""in_production"":false,""languages"":[""de"",""fr"",""lt"",""nl"",""en""],""last_air_date"":""2001-11-04"",""name"":""Band of Brothers"",""networks"":[{""id"":49,""name"":""HBO""}],""number_of_episodes"":10,""number_of_seasons"":1,""origin_country"":[""GB"",""US""],""original_language"":""en"",""original_name"":""Band of Brothers"",""overview"":""Drawn from interviews with survivors of Easy Company, as well as their journals and letters, Band of Brothers chronicles the experiences of these men from paratrooper training in Georgia through the end of the war. As an elite rifle company parachuting into Normandy early on D-Day morning, participants in the Battle of the Bulge, and witness to the horrors of war, the men of Easy knew extraordinary bravery and extraordinary fear - and became the stuff of legend. Based on Stephen E. Ambrose's acclaimed book of the same name."",""popularity"":3.435181,""poster_path"":""/bUrt6oeXd04ImEwQjO9oLjRguaA.jpg"",""production_companies"":[{""name"":""DreamWorks SKG"",""id"":27},{""name"":""HBO Films"",""id"":7429},{""name"":""DreamWorks Television"",""id"":15258}],""seasons"":[{""air_date"":null,""episode_count"":4,""id"":14071,""poster_path"":""/bMN9iiSAdnmAjflREfCCH0TTNyQ.jpg"",""season_number"":0},{""air_date"":""2001-09-09"",""episode_count"":10,""id"":14070,""poster_path"":""/15SN18OVbYt12Wzttclh51Sz9m1.jpg"",""season_number"":1}],""status"":""Ended"",""type"":""Scripted"",""vote_average"":8.5,""vote_count"":47}";
}
[TestMethod]
public void DeserializeTmdbShowData_ValidShowData_ReturnDeserializedObject()
{
//Arrange
string jsonStream = GetJson();
JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
//Act
var tmdbShowDetails = jsonSerializer.Deserialize<List<TmdbShowDetailsDto>>(jsonStream);
//Assert
Assert.IsNotNull(tmdbShowDetails);
Assert.IsNotNull(tmdbShowDetails.First().backdrop_path);
}
public class TmdbShowDetailsDto
{
public string backdrop_path { get; set; }
public Created_By[] created_by { get; set; }
public int[] episode_run_time { get; set; }
public string first_air_date { get; set; }
public Genre[] genres { get; set; }
public string homepage { get; set; }
public int id { get; set; }
public bool in_production { get; set; }
public string[] languages { get; set; }
public string last_air_date { get; set; }
public string name { get; set; }
public Network[] networks { get; set; }
public int number_of_episodes { get; set; }
public int number_of_seasons { get; set; }
public string[] origin_country { get; set; }
public string original_language { get; set; }
public string original_name { get; set; }
public string overview { get; set; }
public float popularity { get; set; }
public string poster_path { get; set; }
public Production_Companies[] production_companies { get; set; }
public Season[] seasons { get; set; }
public string status { get; set; }
public string type { get; set; }
public float vote_average { get; set; }
public int vote_count { get; set; }
}
public class Created_By
{
public int id { get; set; }
public string name { get; set; }
public string profile_path { get; set; }
}
public class Genre
{
public int id { get; set; }
public string name { get; set; }
}
public class Network
{
public int id { get; set; }
public string name { get; set; }
}
public class Production_Companies
{
public string name { get; set; }
public int id { get; set; }
}
public class Season
{
public string air_date { get; set; }
public int episode_count { get; set; }
public int id { get; set; }
public string poster_path { get; set; }
public int season_number { get; set; }
}
Any ideas - Im sure I have missed something glaringly obvious but I cannot see it. Using .NET 4.5
Help appreciated.
Cheers
I used http://json2csharp.com/, and the code is like this, so you should look at it.
public class Poster
{
public string full { get; set; }
public string medium { get; set; }
public string thumb { get; set; }
}
public class Fanart
{
public string full { get; set; }
public string medium { get; set; }
public string thumb { get; set; }
}
public class Images
{
public Poster poster { get; set; }
public Fanart fanart { get; set; }
}
public class Ids
{
public int trakt { get; set; }
public string slug { get; set; }
public int tvdb { get; set; }
public string imdb { get; set; }
public int tmdb { get; set; }
public int tvrage { get; set; }
}
public class Show
{
public string title { get; set; }
public string overview { get; set; }
public int year { get; set; }
public string status { get; set; }
public Images images { get; set; }
public Ids ids { get; set; }
}
public class Poster2
{
public string full { get; set; }
public string medium { get; set; }
public string thumb { get; set; }
}
public class Fanart2
{
public string full { get; set; }
public string medium { get; set; }
public string thumb { get; set; }
}
public class Images2
{
public Poster2 poster { get; set; }
public Fanart2 fanart { get; set; }
}
public class Ids2
{
public int trakt { get; set; }
public string slug { get; set; }
public string imdb { get; set; }
public int tmdb { get; set; }
}
public class Movie
{
public string title { get; set; }
public string overview { get; set; }
public int year { get; set; }
public Images2 images { get; set; }
public Ids2 ids { get; set; }
}
public class Headshot
{
public object full { get; set; }
public object medium { get; set; }
public object thumb { get; set; }
}
public class Images3
{
public Headshot headshot { get; set; }
}
public class Ids3
{
public int trakt { get; set; }
public string slug { get; set; }
public string imdb { get; set; }
public int tmdb { get; set; }
public int tvrage { get; set; }
}
public class Person
{
public string name { get; set; }
public Images3 images { get; set; }
public Ids3 ids { get; set; }
}
public class RootObject
{
public string type { get; set; }
public object score { get; set; }
public Show show { get; set; }
public Movie movie { get; set; }
public Person person { get; set; }
}
You can use Paste-Special Feature in your VS-IDE Paster JSON as Classes
public class Rootobject
{
public Class1[] Property1 { get; set; }
}
public class Class1
{
public string type { get; set; }
public object score { get; set; }
public Show show { get; set; }
public Movie movie { get; set; }
public Person person { get; set; }
}
public class Show
{
public string title { get; set; }
public string overview { get; set; }
public int year { get; set; }
public string status { get; set; }
public Images images { get; set; }
public Ids ids { get; set; }
}
public class Images
{
public Poster poster { get; set; }
public Fanart fanart { get; set; }
}
public class Poster
{
public string full { get; set; }
public string medium { get; set; }
public string thumb { get; set; }
}
public class Fanart
{
public string full { get; set; }
public string medium { get; set; }
public string thumb { get; set; }
}
public class Ids
{
public int trakt { get; set; }
public string slug { get; set; }
public int tvdb { get; set; }
public string imdb { get; set; }
public int tmdb { get; set; }
public int tvrage { get; set; }
}
public class Movie
{
public string title { get; set; }
public string overview { get; set; }
public int year { get; set; }
public Images1 images { get; set; }
public Ids1 ids { get; set; }
}
public class Images1
{
public Poster1 poster { get; set; }
public Fanart1 fanart { get; set; }
}
public class Poster1
{
public string full { get; set; }
public string medium { get; set; }
public string thumb { get; set; }
}
public class Fanart1
{
public string full { get; set; }
public string medium { get; set; }
public string thumb { get; set; }
}
public class Ids1
{
public int trakt { get; set; }
public string slug { get; set; }
public string imdb { get; set; }
public int tmdb { get; set; }
}
public class Person
{
public string name { get; set; }
public Images2 images { get; set; }
public Ids2 ids { get; set; }
}
public class Images2
{
public Headshot headshot { get; set; }
}
public class Headshot
{
public object full { get; set; }
public object medium { get; set; }
public object thumb { get; set; }
}
public class Ids2
{
public int trakt { get; set; }
public string slug { get; set; }
public string imdb { get; set; }
public int tmdb { get; set; }
public int tvrage { get; set; }
}
Look like you JSON string is not in correct format that you are trying to deserialize. For example i have not find show property in the C# class but it present in JSON.
So this issue I couldn't figure out in the night or early in the morning - it took me till this afternoon until I realised that I was had the wrong JSON!!, so no wonder it wasn't working! I got mixed up with a few different apis that provided JSON. Thanks to those who had pointed out that the class looks wrong, made me double check my code and realise the simplicity of this issue. Kinda needed some rubber ducking to spot the problem. Cheers