【问题标题】:convert mvc c# model class to json from datatable将 mvc c# 模型类从数据表转换为 json
【发布时间】:2018-03-11 18:29:35
【问题描述】:

我有一个 C# 类和数据表。

数据表:

+---------+-----------------+---------------+---------+---------+--------------+
| Pers_Id | Pers_First_Name | Pers_Last_Name| OrderNu | OrderId |  Pers_Update |
+---------+-----------------+---------------+---------+---------+--------------+
| 1       |       ABC       |        Ln     |   76454 |  1      |   2018-03-25 |
+---------+-----------------+---------------+---------+---------+--------------+
| 1       |       ABC       |        Ln     |   76578 |  2      |   2018-03-25 |
+---------+-----------------+---------------+---------+---------+--------------+

类:

public class Person
{
    public int Pers_Id { get; set; }
    public string Pers_First_Name { get; set; }
    public string Pers_Last_Name { get; set; }
    public DateTime Pers_Update { get; set; }
    public List<Order> Order_List { get; set; }

    public class Order
    {
        public int OrderID { get; set; }
        public string OrderNu { get; set; }
    }
}

我需要从数据表中绑定这个类,并需要将其转换为 json 对象,以便在 asp .net web API 中响应 rest API。

当我绑定时,我得到了重复的 json,但结果应该是这样的

{ “Pers_Id”:1, "Pers_First_Name": "ABC", "Pers_Last_Name": "LN", "Pers_Update": "", “订单”: [ { "订单ID": "1", “OrderNu”:“76454” }, { "订单ID": "2", “OrderNu”:“76578” } ] }

【问题讨论】:

  • 只需通过 web api 控制器返回类对象。默认情况下,web api 会将响应转换为 json
  • 可以从DataTable中填写List,使用json.net序列化列表。
  • @Marcus,但是如何绑定 this ,实际上让 order_list 为空或重复

标签: c# asp.net asp.net-mvc rest json.net


【解决方案1】:

当你有一个对象(在这个例子中是你的 Employee 对象)时,你应该能够像这样返回它:

return Content(JsonConvert.SerializeObject(employee), "application/json");

更多信息在这里:https://stackoverflow.com/a/34091196/4034346

【讨论】:

  • 感谢您的回答,但实际上我知道这一点
  • 嗨 @NiteeshKumar 我假设您的表位于您的应用程序中(而不是在 JSON 对象中),因为您正在尝试创建一个 json 对象并从存储在系统上的数据中发送它,对吧?
  • 在这种情况下,您只需获取您的 Person 对象的实例。您可以通过直接数据库调用(如何调用 MSSQL DB:stackoverflow.com/a/14172067/4034346)或通过实体框架
  • 我有一个业务层并从中获取数据表并通过循环设置模型值但在 json 中获取重复记录..所以我想知道如何编码的正确方法通过循环通过数据表设置模型并将该模型发送回响应
【解决方案2】:

首先;

using System.Web.Script.Serialization;

第二; 如果您的数据表的类与您的 Person 类不同,那么您应该为您的 Person 创建一个新的数据表版本。

    public class Person
    {
        public int Pers_Id { get; set; }
        public string Pers_First_Name { get; set; }
        public string Pers_Last_Name { get; set; }
        public DateTime Pers_Update { get; set; }
        public List<Order> Order_List { get; set; }
        public class Order
        {
            public int OrderID { get; set; }
            public int OrderNu { get; set; }
        }
    }


    //You need a class that fits to your DataTable
    public class PersonDataTable
    {
        public int Pers_Id { get; set; }
        public string Pers_First_Name { get; set; }
        public string Pers_Last_Name { get; set; }
        public DateTime Pers_Update { get; set; }
        public int OrderId { get; set; }
        public int OrderNu { get; set; }
    }

在你的方法中;

    public string ReturnGoodPeopleJsonFormat()
    {
        JavaScriptSerializer js = new JavaScriptSerializer();//Needed for converting an object to Json string.
        List<PersonDataTable> personDataTableList = new List<PersonDataTable>();//Needed for filling your data from in program or from database
        List<Person> personList = new List<Person>();//Needed 'to be converted' in to Json string


        //Add items to your DataTable list manually
        personDataTableList.Add(
            new PersonDataTable { Pers_Id = 1, Pers_First_Name = "ABC", Pers_Last_Name = "Ln", Pers_Update = Convert.ToDateTime("2018-03-25"), OrderId = 1, OrderNu = 76454 });
        personDataTableList.Add(
            new PersonDataTable { Pers_Id = 1, Pers_First_Name = "ABC", Pers_Last_Name = "Ln", Pers_Update = Convert.ToDateTime("2018-03-25"), OrderId = 2, OrderNu = 76578 });

        //or from database
        // personDataTableList.AddRange(myDatabaseModel.DataTables.ToList());



        //Now group your data by Pers_Id //We are grouping this because we don't want same person 2 or 3 time, we want one person just one time but get all orders in it. That's why we need to group them by Pers_Id
        foreach (var personGroup in personDataTableList.GroupBy(x => x.Pers_Id))
        {
            List<Person.Order> orderList = new List<Person.Order>();

            foreach (var dataTablePerson in personDataTableList.Where(x => x.Pers_Id == personGroup.Key))
            {
                //Get all orders of personGroup one by one in to an Order list from PersonDataTable list by using Pers_Id like a foreign key.
                ///This personGroup.Key is nothing but Pers_Id\\\ 
                orderList.Add(new Person.Order { OrderID = dataTablePerson.OrderId, OrderNu = dataTablePerson.OrderNu });
            }

            //Add new Person object to your personList if you don't have it before (by checking Pers_Id)
            if (personList.Where(x => x.Pers_Id == personGroup.Key).Count() == 0) //This personGroup.Key is nothing but Pers_Id
            {
                personList.Add(new Person
                {
                    Pers_Id = personDataTableList.Where(x => x.Pers_Id == personGroup.Key).FirstOrDefault().Pers_Id,
                    Pers_First_Name = personDataTableList.Where(x => x.Pers_Id == personGroup.Key).FirstOrDefault().Pers_First_Name,
                    Pers_Last_Name = personDataTableList.Where(x => x.Pers_Id == personGroup.Key).FirstOrDefault().Pers_Last_Name,
                    Pers_Update = personDataTableList.Where(x => x.Pers_Id == personGroup.Key).FirstOrDefault().Pers_Update,
                    Order_List = orderList
                });
            }

        }
        string JsonString = js.Serialize(personList);
        return JsonString;
    }

结果是这样的:

[{"Pers_Id":1,"Pers_First_Name":"ABC","Pers_Last_Name":"Ln","Pers_Update":"/Date(1521925200000)/","Order_List":[{"OrderID": 1,"OrderNu":76454},{"OrderID":2,"OrderNu":76578}]}]

【讨论】:

    猜你喜欢
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多