c#将嵌套的子类转换为json

时间:2017-11-22 10:17:06

标签: c# json serialization json.net

我正在尝试(序列化?)JSON中的一个类并且我得到一个空引用异常 - 请你能帮我理解为什么并可能解决这个问题吗?

我写了一个包含几个嵌套类的类(JSON结构由英国运营商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类并从公共变量中提取值。

我在这行上得到一个空引用异常:

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 个答案:

答案 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

是多余的,因为它们应该是任何事件中的默认值。

*(除非此初始化在构造函数中自动完成)