【问题标题】:Serialized as List but only one record is saved序列化为列表但只保存一条记录
【发布时间】:2019-02-27 10:33:35
【问题描述】:

我能够获得一个列表,例如 1 ID : 12 History 并将其放置在模型 Customer 中以映射它并将其放置在 customerList 下以使其成为一个,但是当我对其进行序列化时......输出变为像这样。

如果客户 ID 相同,则历史记录应仅在一个父 INI_CUSTOMER_ID 内。

{
        "INI_CUSTOMER_ID": "liebaj7337",
        "History": [{
            "DealerID": "1",
            "VisitedStoreName": "1",
            "VisitedDate": "1"
            "Activity": "1",
            "VehicleID": "1",
            "VehicleName": "1",
            "OCN": "",
            "Source": "1"
        }]
    }, {
        "INI_CUSTOMER_ID": "LieBaj7337",
        "History": [{
            "DealerID": "2",
            "VisitedStoreName": "2",
            "VisitedDate": "2",
            "Activity": "2",
            "VehicleID": "2",
            "VehicleName": "2",
            "OCN": "",
            "Source": "2"
        }]

预期输出

请检查我的模型是否符合我的预期输出。

{
        "INI_CUSTOMER_ID": "liebaj7337",
        "History": [{
            "DealerID": "1",
            "VisitedStoreName": "1",
            "VisitedDate": "1",
            "Activity": "1",
            "VehicleID": "1",
            "VehicleName": "1",
            "OCN": "",
            "Source": "1"
        },{
            "DealerID": "2",
            "VisitedStoreName": "2",
            "VisitedDate": "2",
            "Activity": "2",
            "VehicleID": "2",
            "VehicleName": "2",
            "OCN": "",
            "Source": "2"
        }]

型号

public class CustomerList
{
    public List<Customer> Customers { get; set; }
}
public class Customer
{
    public string INI_CUSTOMER_ID { get; set; }
    public List<History> History { get; set; }
}

public class History 
{
    public string DealerID { get; set; }
    public string VisitedStoreName { get; set; }
    public string VisitedDate { get; set; }
    public string Activity { get; set; }
    public string VehicleID { get; set; }
    public string VehicleName { get; set; }
    public string OCN { get; set; }
    public string Source { get; set; }
}

【问题讨论】:

    标签: c# json datatable


    【解决方案1】:

    您正在比较具有不同 ID 的 2 个字符串,因为 liebaj7337 与 LieBaj7337 不同,您必须小心区分大小写,您可以执行以下操作:

    if (oldID.Equals(row["CustomerID"].ToString(), StringComparison.InvariantCultureIgnoreCase))
    

    另一个提示:如果您想检查字符串是否为空或 null,只需执行以下操作:

    if (string.IsNullOrEmpty(oldID))
    

    而不是

    if(oldID == "")
    

    编辑:您实际上放错了将客户添加到客户列表的部分,因为只有在完全迭代循环之后添加才有意义

    var jsonSerialiser = new JavaScriptSerializer();
            string json = "";
            DataTable dt = new DataTable();
            dt = Common.GetData(txtDateFrom.Text, txtDateTo.Text);
            DataView dv = new DataView(dt);
            dv.Sort = "MobileNumber, Date";
            string oldID = "";
            List<History> history = new List<History>();
            List<CustomerList> customerLists = new List<CustomerList>();
            List<Customer> customer = new List<Customer>();
            foreach (DataRowView row in dv)
            {
                if (string.IsNullOrEmpty(oldID))
                {
    
                    history.Add(new History
                    {
                        DealerID = row["DealerID"].ToString(),
                        VisitedStoreName = row["DealerName"].ToString(),
                        VisitedDate = row["Date"].ToString(),
                        Activity = row["Activity"].ToString(),
                        VehicleID = row["VehicleID"].ToString(),
                        VehicleName = row["CarModel"].ToString(),
                        OCN = row["OCN"].ToString(),
                        Source = row["Source"].ToString()
                    });
    
                    oldID = row["CustomerID"].ToString();
                }
                else if (oldID.Equals(row["CustomerID"].ToString(), StringComparison.InvariantCultureIgnoreCase)) //compare old to new
                {
                    history.Add(new History
                    {
                        DealerID = row["DealerID"].ToString(),
                        VisitedStoreName = row["DealerName"].ToString(),
                        VisitedDate = row["Date"].ToString(),
                        Activity = row["Activity"].ToString(),
                        VehicleID = row["VehicleID"].ToString(),
                        VehicleName = row["CarModel"].ToString(),
                        OCN = row["OCN"].ToString(),
                        Source = row["Source"].ToString()
                    });
                }
                else
                {
    
                    //{
                    customer.Add(new Customer { INI_CUSTOMER_ID = oldID, History = history });
                    //}; 
    
                    //json += JsonConvert.SerializeObject(customerLists);
                    //clear the history list
                    history.Clear();
    
                    //start a new set
                    history.Add(new History
                    {
                        DealerID = row["DealerID"].ToString(),
                        VisitedStoreName = row["DealerName"].ToString(),
                        VisitedDate = row["Date"].ToString(),
                        Activity = row["Activity"].ToString(),
                        VehicleID = row["VehicleID"].ToString(),
                        VehicleName = row["CarModel"].ToString(),
                        OCN = row["OCN"].ToString(),
                        Source = row["Source"].ToString()
                    });
    
                    oldID = row["CustomerID"].ToString();
                }
            }
    
            json = JsonConvert.SerializeObject(new CustomerList
            {
               Customers = customer
            });
    

    【讨论】:

    • 嗨!感谢您的见解,我应用了它。但我的问题依然存在。
    • 结果100%一样吗?
    • 嗨!我试过了,但现在每个 id 只记录一个历史记录。
    • 嗨,我解决了。稍后将发布解决方案。谢谢!
    【解决方案2】:

    解决方案

    {
    var jsonSerialiser = new JavaScriptSerializer();
                string json = "";
                DataTable dt = new DataTable();
                dt = Common.GetData(txtDateFrom.Text, txtDateTo.Text);
                DataView dv = new DataView(dt);
                dv.Sort = "MobileNumber, Date";
                string oldID = "";
                List<CustomerList> customerLists = new List<CustomerList>();
                List<Customer> customer = new List<Customer>();
                foreach (DataRowView row in dv)
                {
                    if (string.IsNullOrEmpty(oldID))
                    {
                        List<History> history = new List<History>()
                        {
                            new History{
                            DealerID = row["DealerID"].ToString(),
                            VisitedStoreName = row["DealerName"].ToString(),
                            VisitedDate = row["Date"].ToString(),
                            Activity = row["Activity"].ToString(),
                            VehicleID = row["VehicleID"].ToString(),
                            VehicleName = row["CarModel"].ToString(),
                            OCN = row["OCN"].ToString(),
                            Source = row["Source"].ToString()}
                        };
                        oldID = row["CustomerID"].ToString();
                        customer.Add(new Customer {INI_CUSTOMER_ID = oldID, History = history});
                    }
                    else if(oldID.Equals(row["CustomerID"].ToString(), StringComparison.InvariantCultureIgnoreCase)) //compare old to new
                    {
                        List<History> history = new List<History>()
                        {
                            new History{
                            DealerID = row["DealerID"].ToString(),
                            VisitedStoreName = row["DealerName"].ToString(),
                            VisitedDate = row["Date"].ToString(),
                            Activity = row["Activity"].ToString(),
                            VehicleID = row["VehicleID"].ToString(),
                            VehicleName = row["CarModel"].ToString(),
                            OCN = row["OCN"].ToString(),
                            Source = row["Source"].ToString()}
                        };
                        customer.Add(new Customer { INI_CUSTOMER_ID = oldID, History = history});
                    }
                    else
                    {
                        List<History> history = new List<History>()
                        {
                            new History{
                            DealerID = row["DealerID"].ToString(),
                            VisitedStoreName = row["DealerName"].ToString(),
                            VisitedDate = row["Date"].ToString(),
                            Activity = row["Activity"].ToString(),
                            VehicleID = row["VehicleID"].ToString(),
                            VehicleName = row["CarModel"].ToString(),
                            OCN = row["OCN"].ToString(),
                            Source = row["Source"].ToString()}
                        };
                        oldID = row["CustomerID"].ToString();
                        customer.Add(new Customer { INI_CUSTOMER_ID = oldID, History = history });
                    }
                }
    
                foreach (var obj in customer.ToList())
                {
                    var currentItem = customer.FindIndex(a => a.INI_CUSTOMER_ID.ToUpper() == obj.INI_CUSTOMER_ID.ToUpper()); //customer.IndexOf(obj);
                 for (int i = currentItem + 1; i < customer.Count; i++)
                    {
                        if (customer[currentItem].INI_CUSTOMER_ID.ToUpper() == customer[i].INI_CUSTOMER_ID.ToUpper())
                        {
                            customer[currentItem].History.InsertRange(customer[i].History.Count,customer[i].History);
                            customer.RemoveAt(i);
                        }
                    }
                }
                List<Customers> customers = new List<Customers>()
                {
                    new Customers
                    {
                        CUSTOMERS = customer
                    }
                };
                json = JsonConvert.SerializeObject(customers);
                Console.Write(json);
            }
    

    型号

    public class Customers
    {
        public List<Customer> CUSTOMERS { get; set; }
    }
    public class CustomerList
    {
        public string INI_CUSTOMER_ID { get; set; }
        public List<History> History { get; set; }
    }
    public class Customer
    {
        public string INI_CUSTOMER_ID { get; set; }
        public List<History> History { get; set; }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-09-06
      • 1970-01-01
      • 2012-06-01
      • 1970-01-01
      • 2016-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-27
      相关资源
      最近更新 更多