2017-11-22 20 views
0

JSONにクラスを(シリアル化する)しようとしていますが、null参照例外が発生しています。c#ネストされたサブクラスをjsonに変換する

私はいくつかのネストされたクラスを含んでいます(JSON構造はUKのキャリアDPDによって提供されました)。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace DPDJSONLibrary 
{ 
    public class DPD_JSON 
    { 
    // insert shipment request 
     /// <summary> 
     /// Root Object. Insert Shipment Request 
     /// </summary> 
     public class IS 
     { 
      public string job_id { get; set; } 
      public bool collectionOnDelivery { get; set; } 
      public IS_Invoice invoice { get; set; } 
      public string collectionDate { get; set; } 
      public bool consolidate { get; set; } 
      public IS_Consignment consignment { get; set; } 
     } 
     public class IS_Address 
     { 
      public string addressId { get; set; } 
      public string countryCode { get; set; } 
      public string countryName { get; set; } 
      public string county { get; set; } 
      public string locality { get; set; } 
      public string organisation { get; set; } 
      public string postcode { get; set; } 
      public string street { get; set; } 
      public string town { get; set; } 
     } 
     public class IS_ContactDetails 
     { 
      public string contactName { get; set; } 
      public string telephone { get; set; } 
     } 
     public class IS_PickupLocation 
     { 
      public IS_Address address { get; set; } 
      public bool allowRemotePickup { get; set; } 
      public string pickupLocationCode { get; set; } 
     } 
     public class IS_NotificationDetails 
     { 
      public string email { get; set; } 
      public string mobile { get; set; } 
     } 
     public class IS_ParcelProduct 
     { 
      public string countryOfOrigin { get; set; } 
      public Int32 numberOfItems { get; set; } 
      public string productCode { get; set; } 
      public string productFabricContent { get; set; } 
      public string productHarmonisedCode { get; set; } 
      public string productItemsDescription { get; set; } 
      public string productTypeDescription { get; set; } 
      public decimal unitValue { get; set; } 
      public decimal unitWeight { get; set; } 
     } 

     public class IS_InvoiceItem 
     { 
      public string countryOfOrigin { get; set; } 
      public string itemCode { get; set; } 
      public string itemDescription { get; set; } 
      public int numberOfItems { get; set; } 
      public decimal unitValue { get; set; } 
     } 

     public class IS_InvoiceBillingDetails 
     { 
      public IS_Address address { get; set; } 
      public IS_ContactDetails contactDetails { get; set; } 
      public string vatNumber { get; set; } 
     } 

     public class IS_Invoice 
     { 
      public string countryOfOrigin { get; set; } 
      public IS_InvoiceBillingDetails invoiceBillingDetails { get; set; } 
      public string invoiceCustomsNumber { get; set; } 
      public string invoiceExportReason { get; set; } 
      public bool invoiceIsDeclared { get; set; } 
      public IS_InvoiceItem invoiceItem { get; set; } 
      public string invoiceTermsOfDelivery { get; set; } 
      public int invoiceType { get; set; } 
      public int totalItems { get; set; } 
      public decimal totalValue { get; set; } 
      public decimal totalWeight { get; set; } 
     } 

     public class IS_DeliveryDetails 
     { 
      public IS_Address address { get; set; } 
      public IS_ContactDetails contactDetails { get; set; } 
      public IS_NotificationDetails notificationDetails { get; set; } 
      public IS_PickupLocation deliveryDetails { get; set; } 
     } 

     public class IS_CollectionDetails 
     { 
      public IS_Address address { get; set; } 
      public IS_ContactDetails contactDetails { get; set; } 
     } 

     public class IS_Parcels 
     { 
      public bool isVoided { get; set; } 
      public string labelNumber { get; set; } 
      public int packageNumber { get; set; } 
      public string parcelNumber { get; set; } 
      public IS_ParcelProduct parcelProduct { get; set; } 
      public string parcelnetBarcode { get; set; } 
      public string parcelnetData { get; set; } 
      public string parcelnetLabelNumber { get; set; } 
     } 

     public class IS_Consignment 
     { 
      public IS_CollectionDetails collectionDetails { get; set; } 
      public string consignmentNumber { get; set; } 
      public string consignmentRef { get; set; } 
      public decimal? customsValue { get; set; } 
      public IS_DeliveryDetails deliveryDetails { get; set; } 
      public string deliveryInstructions { get; set; } 
      public bool liability { get; set; } 
      public decimal liabilityValue { get; set; } 
      public string networkCode { get; set; } 
      public int numberOfParcels { get; set; } 
      public IS_Parcels parcel { get; set; } 
      public string parceldescription { get; set; } 
      public string shippingRef1 { get; set; } 
      public string shippingRef2 { get; set; } 
      public string shippingRef3 { get; set; } 
      public decimal totalWeight { get; set; } 
     } 
    } 
} 

私はJSONクラスをインスタンス化し、パブリック変数から値を引き込むために、私はコードからに値を割り当てるパブリック変数を含む別のクラス、およびメソッド/機能を持っています。

私はライン上のnull参照の例外を取得しています:

NewShipmentObject.consignment.consignmentNumber = null; 

エラーが読み取ります

error System.NullReferenceException: Object reference not set to an instance of an object 

私はエラーを呼び出し、取得カム方法は以下の通りです:

using System; 
using System.Text; 
using System.Net; 
// include 
using System.IO; 
using System.Web.UI.WebControls; 
using DPDJSONLibrary; 
using System.Web; 
using Newtonsoft.Json; 

namespace DPDAPILibrary 
{ 
    public class DPD_API 
    { 

     #region public class variables 
     public string BusinessUnit; 
     public string DeliveryDirection; 
     public string NumberOfParcels; 
     public string ShipmentType; 
     public string TotalWeight; 
     public string CollectionDate; 
     public string ColName; 
     public string ColPhone; 
     public string ColOrganisation; 
     public string ColCountryCode; 
     public string ColPostCode; 
     public string ColStreet; 
     public string ColLocality; 
     public string ColTown; 
     public string ColCounty; 
     public string DelName; 
     public string DelPhone; 
     public string DelOrganisation; 
     public string DelCountryCode; 
     public string DelPostcode; 
     public string DelStreet; 
     public string DelLocality; 
     public string DelTown; 
     public string DelCounty; 
     public string DelNotificationEmail; 
     public string DelNotificationMobile; 
     public string NetworkCode; 
     public string ShippingRef1; 
     public string ShippingRef2; 
     public string ShippingRef3; 
     public string CustomsValue; 
     public string DeliveryInstructions; 
     public string ParcelDescription; 
     public string LiabilityValue; 
     public string Liability; 
     #endregion 


     public Boolean insertShipment(out string JSONData) 
     { 
      try 
      { 
       DPD_JSON.IS NewShipmentObject = new DPD_JSON.IS(); 

       NewShipmentObject.job_id = null; 
       NewShipmentObject.collectionOnDelivery = false; 
       NewShipmentObject.invoice = null; 
       NewShipmentObject.collectionDate = CollectionDate; 
       NewShipmentObject.consolidate = false; 
       NewShipmentObject.consignment.consignmentNumber = null; 
       NewShipmentObject.consignment.consignmentRef = null; 
       NewShipmentObject.consignment.parcel = null; 

       NewShipmentObject.consignment.collectionDetails.contactDetails.contactName = ColName; 
       NewShipmentObject.consignment.collectionDetails.contactDetails.telephone = ColPhone; 
       NewShipmentObject.consignment.collectionDetails.address.organisation = ColOrganisation; 
       NewShipmentObject.consignment.collectionDetails.address.countryCode = ColCountryCode; 
       NewShipmentObject.consignment.collectionDetails.address.postcode = ColPostCode; 
       NewShipmentObject.consignment.collectionDetails.address.street = ColStreet; 
       NewShipmentObject.consignment.collectionDetails.address.locality = ColLocality; 
       NewShipmentObject.consignment.collectionDetails.address.town = ColTown; 
       NewShipmentObject.consignment.collectionDetails.address.county = ColCounty; 

       NewShipmentObject.consignment.deliveryDetails.contactDetails.contactName = ColName; 
       NewShipmentObject.consignment.deliveryDetails.contactDetails.telephone = DelPhone; 
       NewShipmentObject.consignment.deliveryDetails.address.organisation = DelOrganisation; 
       NewShipmentObject.consignment.deliveryDetails.address.countryCode = DelCountryCode; 
       NewShipmentObject.consignment.deliveryDetails.address.postcode = DelPostcode; 
       NewShipmentObject.consignment.deliveryDetails.address.street = DelStreet; 
       NewShipmentObject.consignment.deliveryDetails.address.locality = DelLocality; 
       NewShipmentObject.consignment.deliveryDetails.address.town = DelTown; 
       NewShipmentObject.consignment.deliveryDetails.address.county = DelCounty; 

       NewShipmentObject.consignment.deliveryDetails.notificationDetails.email = DelNotificationEmail; 
       NewShipmentObject.consignment.deliveryDetails.notificationDetails.mobile = DelNotificationMobile; 

       // default output value 
       JSONData = ""; 

       JSONData = Convert.ToString(JsonConvert.SerializeObject(NewShipmentObject)); 

      } 
      catch (Exception ex) 
      { 
       JSONData = Convert.ToString(ex); 
       return false; 
      } 
     } 
    } 
} 
+1

NewShipmentObjectの委託プロパティがnullであるように見えます。 –

+0

なぜ賛成投票ですか? –

答えて

1

子オブジェクトを含むすべてのオブジェクトを初期化する必要があります*それらのデフォルト値を採用します(オブジェクトの場合はnullになります)。すなわちで

NewShipmentObject.consignment.consignmentNumber = null; 

を置き換える:

NewShipmentObject.consignment = new IS_Consignment(); 
NewShipmentObject.consignment.consignmentNumber = null; 

あなたが自分でタイピングを大幅に節約することができます - 代わりに、各フィールドのライン・バイ・ライン設定には、オブジェクト初期化子構文を使用して行うことができます。

var NewShipmentObject = new DPD_JSON.IS 
{ 
    job_id = null, 
    collectionOnDelivery = false, 
    consignment = new IS_Consignment 
    { 
     consignmentNumber = null, 
     ... more consignment settings here 
    } 
    ... etc. 
あなたが明示的にデフォルト値に初期化されていない変数を設定する必要はないことに留意すべきである

、すなわち両方

job_id = null, 
collectionOnDelivery = false 

はいずれの場合でもデフォルト値である必要があるため、冗長です。

*(この初期化はコンストラクタで自動的に行われていない限り)

関連する問題