序列化为列表,但仅保存一条记录

时间:2019-02-27 10:33:36

标签: c# json datatable

我能够获得一个列表,例如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; }
}

2 个答案:

答案 0 :(得分:0)

您正在比较2个具有不同ID的字符串,因为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
        });

答案 1 :(得分:0)

解决方案

{
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; }
}