使用复杂类型创建和填充对象

时间:2016-12-08 21:20:39

标签: c# json object nested

我正在开发一种最终以JSON格式返回数据提取的API。这不是我的确切代码。我已经简化了这个想法,所以我可以更清楚地传达我的问题。

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

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

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

我是C#和OO的新手。所以,为了这些目的,我一整天都在研究和尝试各种方法。我可以用单个对象做这个没问题,但不能用嵌套类做。我的直觉告诉我,我试图做的事情应该变得更难......但它仍然无法实现。

我试过了(它没有用)。我做了这个课(注意:它与我希望获得的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返回就是一个快照。但我无法弄清楚如何创建这个简单的数据结构!

3 个答案:

答案 0 :(得分: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());
                }
            }

但是尽量不像我那样屠宰格式......

答案 1 :(得分:1)

在我看来,你的JSON结构与你的类结构并不完全匹配。请考虑使用字典将首选项名称与其值匹配,而不是嵌套类。

const getLocalDay = (date) => {
  const dayIndex = date.getDay();
  const daysInWeek = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];

  return daysInWeek[dayIndex];
}

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

答案 2 :(得分: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; }
}