2016-12-08 31 views
0

我正在研究一种最终将以JSON格式返回数据提取的API。这不是我确切的代码。我简化了这个想法,以便我可以更清楚地表达我的问题。创建并填充复杂类型的对象

有一种查询数据库并返回以下列的方法: CustomerID,CustomerName,Preference,PreferenceValue(其中一个客户将有几十个首选项)。数据集按CustomerID排序。

我的目标是返回一个JSON对象是这样的:

{ 
    "Customer": { 
    "CustomerID": "123", 
    "CustomerName": "John Smith", 
    "CustomerPreferences": { 
     "Color": "Red", 
     "Texture": "Rough", 
     "Size": "Medium", 
     "Weight": "Heavy" 
    } 
    } 
} 

我是新的C#和面向对象。所以,为了达到这些目的,我一直在研究和尝试各种方法。我可以用单个对象做到这一点没有问题,但不能用嵌套类。我的直觉告诉我,我想要做的事情不应该更难......但它仍然在逃避我。

我试过了(它没有工作)。我做了这个类(注:这是相同的形状,我希望能得到JSON):

public class Customer 
{ 
    public string CustomerID { get; set; } 
    public string CustomerName { get; set; } 
    public class Preferences 
    { 
     public string Preference { get; set; } 
     public string PreferenceValue { get; set; } 
    } 
} 

然后,我创建的对象(虽然在这一点上,我已经确信我在在错误的道路,因为我不得不单独对它们进行初始化):

List<Customer> lstCustomer = new List<Customer>(); 
List<Customer.Preference> lstPref = new List<Customer.Preference>(); 

然后我试图通过我的查询结果循环......(不知道为什么我还在分享这一点,因为我知道它不”我可能会很尴尬!!):

if (rdr.HasRows) 
{ 
    string CurrentCustomer = ""; 
    while (rdr.Read()) 
    { 
     /* 
     Since the data is sorted by CustID, 
     I only add the parent class when it changes. 
     */ 
     if (CurrentCustomer != rdr["CustID"].ToString()) 
     { 
      lstCustomer.Add(new Customer 
      { 
       CustomerID = rdr["CustID"].ToString(), 
       CustomerName = rdr["CustomerName"].ToString() 
      }); 
      CurrentCustomer = rdr["CustID"].ToString(); 
     } 

     lstPref.Add(new Customer.Preference 
     { 
      PrefName = rdr["PreferanceName"].ToString(), 
      PrefValue = rdr["PreferenceValue"].ToString() 
     }); 

    } 
} 

我有这种感觉比较容易。我一直在搜索和搜索,并找不到解决方案。一旦我创建并填充了一个对象,将它作为JSON返回是很简单的。但我无法弄清楚如何创建这个简单的数据结构!

回答

2

你并不遥远。我的东西是这样的

public class Customer 
    { 
     public string CustomerID { get; set; } 
     public string CustomerName { get; set; } 
     public Dictionary<string, string> Preferences { get; set; } 
     public Customer() 
     { 
      Preferences = new Dictionary<string, string>(); 
     } 

    } 

List<Customer> customers = new List<Customer>(); 

      if (rdr.HasRows) 
      { 
       Customer CurrentCustomer = new Customer(); 
       while (rdr.Read()) 
       { 
        /* 
        Since the data is sorted by CustID, 
        I only add the parent class when it changes. 
        */ 
        if (CurrentCustomer.CustomerID != rdr["CustID"].ToString()) 
        { 
         CurrentCustomer = new Customer() 
         { 
          CustomerID = rdr["CustID"].ToString(), 
          CustomerName = rdr["CustomerName"].ToString() 
         }; 
         customers.Add(CurrentCustomer); 
        } 
        CurrentCustomer.Preferences.Add(rdr["PreferanceName"].ToString(), 
         rdr["PreferenceValue"].ToString()); 
       } 
      } 

但尽量不要像我一样杀猪格式...

0

您Customer类之外将喜好,定义一个属性,而不是:

public class Customer 
{ 
    public string CustomerID { get; set; } 
    public string CustomerName { get; set; } 
    public List<Preference> Preferences { get; set;} 
} 

public class Preference 
{ 
    public string Preference { get; set; } 
    public string PreferenceValue { get; set; } 
} 
1

在我看来,你的JSON结构和类结构真的不匹配。可以考虑使用字典来将首选项名称与其值相匹配,而不是嵌套类。

public class Customer 
{ 
    public string CustomerID { get; set; } 
    public string CustomerName { get; set; } 
    public Dictionary<string, string> Preferences { get; } 
} 

然后,您可以使用通常的添加方法为您的字典添加首选项。