2011-10-26 3 views
0

Я пытаюсь создать класс для сериализации и десериализации массивов. Созданный мной класс, похоже, работает для десериализации, но когда я пытаюсь сериализовать массив, у меня возникают проблемы. Я довольно новый разработчик C#, и я уверен, что оставил важную часть своего кода, я просто не уверен, что.Сериализация массива JSON.NET в C# .NET

Ниже копия класса я создал:

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 protected]"; 
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 = "Address 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"; 

Как только я ударил жирным шрифтом строки, я получаю следующее ошибка:

«объект не задана ссылка на экземпляр объекта»

Опять же, я опровергаю Это связано с тем, что я неправильно инициализировал часть AddressBook кода. Однако я не уверен, как это сделать с массивом.

Не могли бы вы предоставить мне какое-то направление?

Спасибо,

Zach

ответ

1

Попробуйте это (10 адресных книг):

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

Вы должны создать экземпляр массива, прежде чем пытаться назначить элементы в нем

2

(Чтобы быть ясным, это не имеет ничего общего с 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, в качестве адресной книги является коллекция адресов.

+0

Джон, Когда я добавляю, что у вас есть предположил, я получаю сообщение об ошибке: «Невозможно неявно преобразовать тип» System.Collections.Generic.List 'в PinnacleCartFormAPI.AddressBook ". Не могли бы вы объяснить, что я здесь делаю неправильно? Мне нужно изменить раздел AddressBook моего класса? – WebTech

+0

@WebTech: вам нужно изменить свойство 'AddressBook' * * в вашем классе' Customer' для типа 'List ' (или, возможно, 'IList '). –

+0

Большое вам спасибо за помощь. Используя то, что вы предоставили, все работает так, как я ожидал. – WebTech

0

Согласован с ответом Джона - я не тратил кучу времени на это, но, возможно, вы найдете этот рефакторинг набор классов полезный:

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; } 
    } 
} 
+0

Большое спасибо за вашу помощь. Я буду реализовывать эти изменения и видеть, как все идет. – WebTech