1

I have an API that responds with changing JSON.

I've tried building a class and discovered the changes when I got exceptions on the next API response. The API is UPS QUANTUM VIEW.

JSON Response:

{
"QuantumViewResponse": {
    "Response": {
        "TransactionReference": {
            "CustomerContext": "Customer Context"
        },
        "ResponseStatusCode": "1",
        "ResponseStatusDescription": "Success"
    },
    "QuantumViewEvents": {
        "SubscriberID": "UserID",
        "SubscriptionEvents": {
            "Name": "Outbound",
            "Number": "E7D1D134430FB9B",
            "SubscriptionStatus": {
                "Code": "A",
                "Description": "Active"
            },
            "SubscriptionFile": [{
                "FileName": "170609_163015001",
                "StatusType": {
                    "Code": "U",
                    "Description": "Unread"
                },
                "Manifest": [{
                    "Shipper": {
                        "Name": "HART SYSTEMS",
                        "ShipperNumber": "E033E4",
                        "Address": {
                            "AddressLine1": "60 PLANT AVE",
                            "City": "HAUPPAUGE",
                            "StateProvinceCode": "NY",
                            "PostalCode": "11788-3810",
                            "CountryCode": "US"
                        }
                    },
                    "ShipTo": {
                        "AttentionName": "STORE MANAGER",
                        "PhoneNumber": "11111111111",
                        "Address": {
                            "ConsigneeName": "J. CREW (000172)",
                            "AddressLine1": "800 BREVARD ROAD  SUITE 224",
                            "City": "ASHEVILLE",
                            "StateProvinceCode": "NC",
                            "PostalCode": "28806",
                            "CountryCode": "US"
                        }
                    },
                    "ReferenceNumber": [{
                        "Number": "1",
                        "Value": "852-01"
                    },
                    {
                        "Number": "2",
                        "Value": "852-01-INV. EQUIPMENT"
                    }],
                    "Service": {
                        "Code": "002"
                    },
                    "PickupDate": "20170609",
                    "ScheduledDeliveryDate": "20170613",
                    "ScheduledDeliveryTime": "235900",
                    "DocumentsOnly": "3",
                    "Package": {
                        "Activity": {
                            "Date": "20170609",
                            "Time": "160513"
                        },
                        "Dimensions": {
                            "Length": "00000000",
                            "Width": "00000000",
                            "Height": "00000000"
                        },
                        "DimensionalWeight": {
                            "UnitOfMeasurement": {
                                "Code": "LBS"
                            },
                            "Weight": "0000090"
                        },
                        "PackageWeight": {
                            "Weight": "+0009.0"
                        },
                        "TrackingNumber": "1ZE033E40258160923",
                        "ReferenceNumber": [{
                            "Number": "1",
                            "Value": "852-01"
                        },
                        {
                            "Number": "2",
                            "Value": "852-01-INV. EQUIPMENT"
                        },
                        {
                            "Number": "3",
                            "Value": "4345-2"
                        },
                        {
                            "Number": "4",
                            "Value": "4345-2"
                        },
                        {
                            "Number": "5",
                            "Value": "000172"
                        }],
                        "PackageServiceOptions": {
                            "COD": ""
                        }
                    },
                    "ShipmentChargeType": "T/P",
                    "BillToAccount": {
                        "Option": "03",
                        "Number": "4R2799"
                    }
                },
                {
                    "Shipper": {
                        "Name": "HART SYSTEMS",
                        "ShipperNumber": "E033E4",
                        "Address": {
                            "AddressLine1": "60 PLANT AVE",
                            "City": "HAUPPAUGE",
                            "StateProvinceCode": "NY",
                            "PostalCode": "11788-3810",
                            "CountryCode": "US"
                        }
                    },
                    "ShipTo": {
                        "AttentionName": "STORE MANAGER",
                        "PhoneNumber": "18282743995",
                        "Address": {
                            "ConsigneeName": "J. CREW (000730)",
                            "AddressLine1": "10 BROOK STREET",
                            "AddressLine2": "SPACE # 160",
                            "City": "ASHEVILLE",
                            "StateProvinceCode": "NC",
                            "PostalCode": "28803",
                            "CountryCode": "US"
                        }
                    },
                    "ReferenceNumber": [{
                        "Number": "1",
                        "Value": "852-01"
                    },
                    {
                        "Number": "2",
                        "Value": "852-01-INV. EQUIPMENT"
                    }],
                    "Service": {
                        "Code": "002"
                    },
                    "PickupDate": "20170609",
                    "ScheduledDeliveryDate": "20170613",
                    "ScheduledDeliveryTime": "235900",
                    "DocumentsOnly": "3",
                    "Package": {
                        "Activity": {
                            "Date": "20170609",
                            "Time": "160513"
                        },
                        "Dimensions": {
                            "Length": "00000000",
                            "Width": "00000000",
                            "Height": "00000000"
                        },
                        "DimensionalWeight": {
                            "UnitOfMeasurement": {
                                "Code": "LBS"
                            },
                            "Weight": "0000090"
                        },
                        "PackageWeight": {
                            "Weight": "+0009.0"
                        },
                        "TrackingNumber": "1ZE033E40260385730",
                        "ReferenceNumber": [{
                            "Number": "1",
                            "Value": "852-01"
                        },
                        {
                            "Number": "2",
                            "Value": "852-01-INV. EQUIPMENT"
                        },
                        {
                            "Number": "3",
                            "Value": "4345-2"
                        },
                        {
                            "Number": "4",
                            "Value": "4345-2"
                        },
                        {
                            "Number": "5",
                            "Value": "000730"
                        }],
                        "PackageServiceOptions": {
                            "COD": ""
                        }
                    },
                    "ShipmentChargeType": "T/P",
                    "BillToAccount": {
                        "Option": "03",
                        "Number": "4R2799"
                    }
                }]
            },
            {
                "FileName": "170609_200029001",
                "StatusType": {
                    "Code": "U",
                    "Description": "Unread"
                },
                "Origin": [{
                    "PackageReferenceNumber": [{
                        "Number": "1",
                        "Value": "852-01"
                    },
                    {
                        "Number": "2",
                        "Value": "852-01-INV. EQUIPMENT"
                    },
                    {
                        "Number": "3",
                        "Value": "4345-2"
                    },
                    {
                        "Number": "4",
                        "Value": "4345-2"
                    },
                    {
                        "Number": "5",
                        "Value": "000172"
                    }],
                    "ShipmentReferenceNumber": [{
                        "Number": "1",
                        "Value": "852-01"
                    },
                    {
                        "Number": "2",
                        "Value": "852-01-INV. EQUIPMENT"
                    }],
                    "ShipperNumber": "E033E4",
                    "TrackingNumber": "1ZE033E40258160923",
                    "Date": "20170609",
                    "Time": "191855",
                    "ActivityLocation": {
                        "AddressArtifactFormat": {
                            "PoliticalDivision2": "MELVILLE",
                            "PoliticalDivision1": "NY",
                            "CountryCode": "US"
                        }
                    },
                    "BillToAccount": {
                        "Option": "03",
                        "Number": "4R2799"
                    }
                },
                {
                    "PackageReferenceNumber": [{
                        "Number": "1",
                        "Value": "852-01"
                    },
                    {
                        "Number": "2",
                        "Value": "852-01-INV. EQUIPMENT"
                    },
                    {
                        "Number": "3",
                        "Value": "4345-2"
                    },
                    {
                        "Number": "4",
                        "Value": "4345-2"
                    },
                    {
                        "Number": "5",
                        "Value": "000730"
                    }],
                    "ShipmentReferenceNumber": [{
                        "Number": "1",
                        "Value": "852-01"
                    },
                    {
                        "Number": "2",
                        "Value": "852-01-INV. EQUIPMENT"
                    }],
                    "ShipperNumber": "E033E4",
                    "TrackingNumber": "1ZE033E40260385730",
                    "Date": "20170609",
                    "Time": "191431",
                    "ActivityLocation": {
                        "AddressArtifactFormat": {
                            "PoliticalDivision2": "MELVILLE",
                            "PoliticalDivision1": "NY",
                            "CountryCode": "US"
                        }
                    },
                    "BillToAccount": {
                        "Option": "03",
                        "Number": "4R2799"
                    }
                }]
            },
            {
                "FileName": "170612_014530001",
                "StatusType": {
                    "Code": "U",
                    "Description": "Unread"
                },
                "Generic": {
                    "ActivityType": "DS",
                    "TrackingNumber": "1ZE033E49063524561",
                    "ShipperNumber": "E033E4",
                    "ShipmentReferenceNumber": [{
                        "Number": "1",
                        "Value": "873-01"
                    },
                    {
                        "Number": "2",
                        "Value": "873-01"
                    }],
                    "PackageReferenceNumber": [{
                        "Number": "1",
                        "Value": "873-01"
                    },
                    {
                        "Number": "2",
                        "Value": "873-01"
                    },
                    {
                        "Number": "3",
                        "Value": "4329-2"
                    },
                    {
                        "Number": "4",
                        "Value": "4329-2"
                    },
                    {
                        "Number": "5",
                        "Value": "000938"
                    }],
                    "Service": {
                        "Code": "003"
                    },
                    "Activity": {
                        "Date": "20170612",
                        "Time": "010350"
                    },
                    "BillToAccount": {
                        "Option": "03",
                        "Number": "1630X8"
                    },
                    "ShipTo": {
                        "ReceivingAddressName": "HART"
                    }
                }
            },

                "FileName": "170612_083005001",
                "StatusType": {
                    "Code": "U",
                    "Description": "Unread"
                },
                "Generic": [{
                    "ActivityType": "DS",
                    "TrackingNumber": "1ZE033E49062327446",
                    "ShipperNumber": "E033E4",
                    "ShipmentReferenceNumber": [{
                        "Number": "1",
                        "Value": "873-01"
                    },
                    {
                        "Number": "2",
                        "Value": "873-01"
                    }],
                    "PackageReferenceNumber": [{
                        "Number": "1",
                        "Value": "873-01"
                    },
                    {
                        "Number": "2",
                        "Value": "873-01"
                    },
                    {
                        "Number": "3",
                        "Value": "4329-2"
                    },
                    {
                        "Number": "4",
                        "Value": "4329-2"
                    },
                    {
                        "Number": "5",
                        "Value": "000835"
                    }],
                    "Service": {
                        "Code": "003"
                    },
                    "Activity": {
                        "Date": "20170612",
                        "Time": "072521"
                    },
                    "BillToAccount": {
                        "Option": "03",
                        "Number": "1630X8"
                    },
                    "ShipTo": {
                        "ReceivingAddressName": "HART"
                    }
                },
                {
                    "ActivityType": "DS",
                    "TrackingNumber": "1ZE033E49062795226",
                    "ShipperNumber": "E033E4",
                    "ShipmentReferenceNumber": [{
                        "Number": "1",
                        "Value": "873-01"
                    },
                    {
                        "Number": "2",
                        "Value": "873-01"
                    }],
                    "PackageReferenceNumber": [{
                        "Number": "1",
                        "Value": "873-01"
                    },
                    {
                        "Number": "2",
                        "Value": "873-01"
                    },
                    {
                        "Number": "3",
                        "Value": "4329-4"
                    },
                    {
                        "Number": "4",
                        "Value": "4329-4"
                    },
                    {
                        "Number": "5",
                        "Value": "000888"
                    }],
                    "Service": {
                        "Code": "003"
                    },
                    "Activity": {
                        "Date": "20170612",
                        "Time": "073052"
                    },
                    "BillToAccount": {
                        "Option": "03",
                        "Number": "1630X8"
                    },
                    "ShipTo": {
                        "ReceivingAddressName": "HART"
                    }
                },
                {
                    "ActivityType": "DS",
                    "TrackingNumber": "1ZE033E49063212246",
                    "ShipperNumber": "E033E4",
                    "ShipmentReferenceNumber": [{
                        "Number": "1",
                        "Value": "873-01"
                    },
                    {
                        "Number": "2",
                        "Value": "873-01"
                    }],
                    "PackageReferenceNumber": [{
                        "Number": "1",
                        "Value": "873-01"
                    },
                    {
                        "Number": "2",
                        "Value": "873-01"
                    },
                    {
                        "Number": "3",
                        "Value": "4329-2"
                    },
                    {
                        "Number": "4",
                        "Value": "4329-2"
                    },
                    {
                        "Number": "5",
                        "Value": "000651"
                    }],
                    "Service": {
                        "Code": "003"
                    },
                    "Activity": {
                        "Date": "20170612",
                        "Time": "074154"
                    },
                    "BillToAccount": {
                        "Option": "03",
                        "Number": "1630X8"
                    },
                    "ShipTo": {
                        "ReceivingAddressName": "HART"
                    }
                }]
            }]
        }
    }
}

}

Sometimes SubscriptionFile can be an Array sometimes Not. Sometimes Manifest can be an Array, sometimes Not or Not Exist. Sometimes Generic can be an Array sometimes Not OR Not Exist.

I created this class, however the response changes cause it to break, because of the issues above:

    public class TransactionReference
{
    public string CustomerContext { get; set; }
}

public class Response
{
    public TransactionReference TransactionReference { get; set; }
    public string ResponseStatusCode { get; set; }
    public string ResponseStatusDescription { get; set; }
}

public class SubscriptionStatus
{
    public string Code { get; set; }
    public string Description { get; set; }
}

public class StatusType
{
    public string Code { get; set; }
    public string Description { get; set; }
}

public class Address
{
    public string AddressLine1 { get; set; }
    public string City { get; set; }
    public string StateProvinceCode { get; set; }
    public string PostalCode { get; set; }
    public string CountryCode { get; set; }
}

public class Shipper
{
    public string Name { get; set; }
    public string ShipperNumber { get; set; }
    public Address Address { get; set; }
}

public class Address2
{
    public string ConsigneeName { get; set; }
    public string AddressLine1 { get; set; }
    public string City { get; set; }
    public string StateProvinceCode { get; set; }
    public string PostalCode { get; set; }
    public string CountryCode { get; set; }
    public string AddressLine2 { get; set; }
}

public class ShipTo
{
    public string AttentionName { get; set; }
    public string PhoneNumber { get; set; }
    public Address2 Address { get; set; }
}

public class ReferenceNumber
{
    public string Number { get; set; }
    public string Value { get; set; }
}

public class Service
{
    public string Code { get; set; }
}

public class Activity
{
    public string Date { get; set; }
    public string Time { get; set; }
}

public class Dimensions
{
    public string Length { get; set; }
    public string Width { get; set; }
    public string Height { get; set; }
}

public class UnitOfMeasurement
{
    public string Code { get; set; }
}

public class DimensionalWeight
{
    public UnitOfMeasurement UnitOfMeasurement { get; set; }
    public string Weight { get; set; }
}

public class PackageWeight
{
    public string Weight { get; set; }
}

public class ReferenceNumber2
{
    public string Number { get; set; }
    public string Value { get; set; }
}

public class PackageServiceOptions
{
    public string COD { get; set; }
}

public class Package
{
    public Activity Activity { get; set; }
    public Dimensions Dimensions { get; set; }
    public DimensionalWeight DimensionalWeight { get; set; }
    public PackageWeight PackageWeight { get; set; }
    public string TrackingNumber { get; set; }
    public List<ReferenceNumber2> ReferenceNumber { get; set; }
    public PackageServiceOptions PackageServiceOptions { get; set; }
}

public class BillToAccount
{
    public string Option { get; set; }
    public string Number { get; set; }
}

public class Manifest
{
    public Shipper Shipper { get; set; }
    public ShipTo ShipTo { get; set; }
    public List<ReferenceNumber> ReferenceNumber { get; set; }
    public Service Service { get; set; }
    public string PickupDate { get; set; }
    public string ScheduledDeliveryDate { get; set; }
    public string ScheduledDeliveryTime { get; set; }
    public string DocumentsOnly { get; set; }
    public Package Package { get; set; }
    public string ShipmentChargeType { get; set; }
    public BillToAccount BillToAccount { get; set; }
}

public class PackageReferenceNumber
{
    public string Number { get; set; }
    public string Value { get; set; }
}

public class ShipmentReferenceNumber
{
    public string Number { get; set; }
    public string Value { get; set; }
}

public class AddressArtifactFormat
{
    public string PoliticalDivision2 { get; set; }
    public string PoliticalDivision1 { get; set; }
    public string CountryCode { get; set; }
}

public class ActivityLocation
{
    public AddressArtifactFormat AddressArtifactFormat { get; set; }
}

public class BillToAccount2
{
    public string Option { get; set; }
    public string Number { get; set; }
}

public class Origin
{
    public List<PackageReferenceNumber> PackageReferenceNumber { get; set; }
    public List<ShipmentReferenceNumber> ShipmentReferenceNumber { get; set; }
    public string ShipperNumber { get; set; }
    public string TrackingNumber { get; set; }
    public string Date { get; set; }
    public string Time { get; set; }
    public ActivityLocation ActivityLocation { get; set; }
    public BillToAccount2 BillToAccount { get; set; }
}

public class SubscriptionFile
{
    public string FileName { get; set; }
    public StatusType StatusType { get; set; }
    public List<Manifest> Manifest { get; set; }
    public List<Origin> Origin { get; set; }
    public object Generic { get; set; }
}

public class SubscriptionEvents
{
    public string Name { get; set; }
    public string Number { get; set; }
    public SubscriptionStatus SubscriptionStatus { get; set; }
    public List<SubscriptionFile> SubscriptionFile { get; set; }
}

public class QuantumViewEvents
{
    public string SubscriberID { get; set; }
    public SubscriptionEvents SubscriptionEvents { get; set; }
}

public class QuantumViewResponse
{
    public Response Response { get; set; }
    public QuantumViewEvents QuantumViewEvents { get; set; }
}

public class RootObject
{
    public QuantumViewResponse QuantumViewResponse { get; set; }
}
Ryan Dooley
  • 224
  • 1
  • 3
  • 16

1 Answers1

3

If you don't actually know entire contract, but want to use some of fields and don't care about other fields, you can use dynamic:

dynamic obj = JsonConver.DeserializeObject(input);

var status = (int)obj.QuantumViewResponse.Response.ResponseStatusCode;

Well, if you care about entire structure - you have no other way but ask for contract, or predict it somehow.

eocron
  • 6,885
  • 1
  • 21
  • 50
  • The Problem with this is when an object I'm declaring isn't there I will get a exception, probably an Object Reference. – Ryan Dooley Jun 23 '17 at 15:16
  • 1
    Well, what do else you expect? You cannot access things that aren’t there, and if you can’t make promises at compile time how the structure will look like, then you will have to dynamically test for it at runtime. – poke Jun 23 '17 at 15:20