【问题标题】:JSON.NET Array Serialization in C#.NETC#.NET 中的 JSON.NET 数组序列化
【发布时间】:2011-10-26 05:50:06
【问题描述】:

我正在尝试创建一个用于序列化和反序列化数组的类。我创建的类似乎正在反序列化,但是当我尝试序列化数组时,我遇到了问题。我是一个相当新的 C# 开发人员,我确信我在我的代码中留下了一个重要的部分,我只是不确定是什么。

下面是我创建的类的副本:

namespace PinnacleCartFormAPI
{
    class clsGetCustomersResponse
    {
        public Customer Customer = new Customer();//{ get; set; }
    }

    public class Customer
    {
        public Int32 UserId;
        public string UserName;
        public CustBilling Billing = new CustBilling();
        public AddressBook[] AddressBook;// AddressBook = new AddressBook();
    }

    public class CustBilling
    {
        public string FullName, FirstName, LastName, Email, Company, Phone;
        public CustAddress Address = new CustAddress();
    }

    public class CustAddress
    {
        public string Name, Street1, Street2, City, State, Zip, Country;
    }

    public class AddressBook
    {
        public string Name, Street1, Street2, City, State, Zip, Country;
    }
}

如您所见,AddressBook 类需要是一个数组。我相信我的问题与我没有将 AddressBook 类作为数组正确启动这一事实有关。

下面是为类的不同元素添加值的调用代码的副本:

clsGetCustomersResponse GetCustomersResp = new clsGetCustomersResponse();
GetCustomersResp.Customer.UserId = 123456;
GetCustomersResp.Customer.UserName = "Username";
GetCustomersResp.Customer.Billing.FullName = "Full Name";
GetCustomersResp.Customer.Billing.FirstName = "First Name";
GetCustomersResp.Customer.Billing.LastName = "Last Name";    
GetCustomersResp.Customer.Billing.Email = "email@domain.com";
GetCustomersResp.Customer.Billing.Phone = "7778889999";
GetCustomersResp.Customer.Billing.Address.Name = "Address Name";
GetCustomersResp.Customer.Billing.Address.Street1 = "Address Street 1";
GetCustomersResp.Customer.Billing.Address.Street2 = "";
GetCustomersResp.Customer.Billing.Address.City = "Address City";
GetCustomersResp.Customer.Billing.Address.State = "Address State";
GetCustomersResp.Customer.Billing.Address.Zip = "Address Zip";
GetCustomersResp.Customer.Billing.Address.Country = "Address Country";

GetCustomersResp.Customer.AddressBook[0].Name = "地址名称";

GetCustomersResp.Customer.AddressBook[0].Street1 = "Address Street 1";
GetCustomersResp.Customer.AddressBook[0].Street2 = "";
GetCustomersResp.Customer.AddressBook[0].City = "Address City";
GetCustomersResp.Customer.AddressBook[0].State = "Address State";
GetCustomersResp.Customer.AddressBook[0].Zip = "Address Zip";
GetCustomersResp.Customer.AddressBook[0].Country = "Address Country";

当我点击粗体线时,我收到以下错误:

“对象引用未设置为对象的实例”

再次,我相信这是我没有正确初始化代码的地址簿部分的结果。但是,我不确定如何处理数组。

能否请您给我一些指导?

谢谢,

扎克

【问题讨论】:

    标签: arrays serialization json.net


    【解决方案1】:

    (要明确一点,这与 JSON 没有任何关系。)

    是的,您必须先初始化一个数组,然后才能开始将值放入其中。不幸的是,数组的大小是固定的——你不能在创建后更改大小(例如通过添加元素)。我建议使用 List<AddressBook> 而不是数组。然后你可以使用:

    // This initialization could be in the type itself
    GetCustomersResp.Customer.AddressBook = new List<AddressBook>();
    
    AddressBook address = new AddressBook();
    address.Name = "Address Name";
    address.Street1 = "Address Street 1";
    // etc
    
    GetCustomersResp.Customer.AddressBook.Add(address);
    

    我也很想重命名 AddressBook 类型 - 它只是一个地址,而不是整个地址簿。 Customer 中的属性仍然可以称为AddressBook,因为地址簿地址的集合。

    【讨论】:

    • 乔恩,当我添加您的建议时,我收到一个错误:“无法将类型 'System.Collections.Generic.List' 隐式转换为 PinnacleCartFormAPI.AddressBook”。你能解释一下我在这里做错了什么吗?我需要更改班级的地址簿部分吗?
    • @WebTech:您需要将Customer 类中的AddressBook property 更改为List&lt;AddressBook&gt; 类型(或者可能是IList&lt;AddressBook&gt;)。跨度>
    • 非常感谢您在这方面的帮助。使用您提供的内容,一切都按我的预期进行。
    【解决方案2】:

    试试这个(10 个地址簿):

    GetCustomersResp.Customer.AddressBook = new AddressBook[10];
    

    您需要先实例化您的数组,然后再尝试在其中分配元素

    【讨论】:

      【解决方案3】:

      同意 Jon 的回答 - 我没有花太多时间在上面,但也许你会发现这组重构的类很有用:

      namespace Pinnacle.Cart.Customers
      {
          public class RetrieveResponse
          {
              public RetrieveResponse() { }
      
              public RetrieveResponse(Customer customer) { 
                  Customer = customer;
              }
      
              public Customer Customer { get; set; }
          }
      
          public class Customer
          {
              public Customer() { 
                  Billing = new BillingInfo(); 
                  AddressBook = new List<AddressBookEntry>(); 
              }
      
              public Int UserId  { get; set; }
              public String UserName  { get; set; }
              public BillingInfo Billing  { get; set; }
              public List<AddressBookEntry> AddressBook { get; set; }
      
              public class BillingInfo
              {
                  public BillingInfo() { Address = new Address(); }
      
                  public String FullName { get; set; }
                  public String FirstName { get; set; }
                  public String LastName { get; set; }
                  public String Email { get; set; }
                  public String Company { get; set; }
                  public String Phone { get; set; }
                  public Address Address { get; set; }
              }
          }
      
          public class Address
          {
              public String Street1 { get; set; }
              public String Street2 { get; set; }
              public String City { get; set; }
              public String State { get; set; }
              public String Zip { get; set; }
              public String Country { get; set; }
          }
      
          public class AddressBookEntry : Address
          {
              public string Name { get; set; }
          }
      }
      

      【讨论】:

      • 非常感谢您的帮助。我将实施这些更改,看看情况如何。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      • 2011-02-08
      • 2020-03-09
      • 1970-01-01
      • 2012-03-09
      • 2016-08-20
      • 1970-01-01
      相关资源
      最近更新 更多