【问题标题】:How to create json structure from list of data?如何从数据列表中创建 json 结构?
【发布时间】:2016-04-05 10:20:14
【问题描述】:

我想用我的列表对象中的嵌套对象创建 json 结构。

这是我的课:

public class Employee
{
     public int EmployeeId { get; set; }
     public int Skillssetpoints { get; set; }
     public string Name { get; set; }
     public Nullable<System.DateTime> Date { get; set; }
}

public class EmployeeModel
{
     public int EmployeeId { get; set; }
     public List<int> Skillssetpoints { get; set; }
     public string Name { get; set; }
     public Nullable<System.DateTime> Date { get; set; }
}

记录是这样的:

EmployeeId   SkillssetPoints   Date
 1              10             4/5/2016 16:12:12
 2              12             3/5/2016 17:12:12
 3              4              8/5/2016 8:12:12
 4              20             1/5/2016 2:12:12

这就是我获取数据的方式:

var data=context.Employee.Tolist();

获取数据后,我想使用EmployeeModel 从上述数据创建这个 json 结构 并返回:

预期输出:

 {"Date":"8-5-2016 08:12:12","SkillssetPoints":[4,10,12,20]}

在日期字段中,我将采用最高日期,因此 8-5-2016SkillssetPoints 将按升序排列。

如何用我的 EmployeeModel 类创建这个 json 结构??

【问题讨论】:

  • 您应该明确说明您只希望返回 1 条记录,并且您希望有人告诉您如何过滤您的员工​​列表列表,以便它只显示“最高日期”

标签: c# .net json linq asp.net-web-api


【解决方案1】:

添加对 nuget 包 Newtonsoft.Json 的引用,然后使用 ...

string result = JsonConvert.Serialize(data); 

看来您需要先进行投影,然后将结果序列化,将数据库中的数据转换为模型格式...

var groupedData = data
    .GroupBy(s => s.EmployeeId)
    .OrderBy(s => s.Date)
    .Select(g => new EmployeeModel {
        EmployeeId = g.Key,
        Name = g.First().Name,
        Date = g.First().Date,
        Skillssetpoints = g.Select(s => s.Skillssetpoints).OrderBy(i => i).ToList()
    });

这应该会产生这个模型的集合......

public class EmployeeModel
{
    public int EmployeeId { get; set; }
    public List<int> Skillssetpoints { get; set; }
    public string Name { get; set; }
    public DateTime? Date { get; set; }
}

...当我这样做时...

var data = new List<EmployeeModel> {
    new EmployeeModel { EmployeeId = 1, Name = "Homer Simpson", Skillssetpoints = new List<int> { 1,2,3,4 }, Date = DateTime.Now },
    new EmployeeModel { EmployeeId = 2, Name = "Marge Simpson", Skillssetpoints = new List<int> { 1,2,3,4 }, Date = DateTime.Now },
    new EmployeeModel { EmployeeId = 3, Name = "Lisa Simpson", Skillssetpoints = new List<int> { 1,2,3,4 }, Date = DateTime.Now },
    new EmployeeModel { EmployeeId = 4, Name = "Bart Simpson", Skillssetpoints = new List<int> { 1,2,3,4 }, Date = DateTime.Now }
};

var result = JsonConvert.SerializeObject(data);

我得到这个输出...

[
    {
        "EmployeeId": 1,
        "Skillssetpoints": [1,2,3,4],
        "Name": "Homer Simpson",
        "Date": "2016-04-05T11:42:09.9126748+01:00"
    },
    {
        "EmployeeId": 2,
        "Skillssetpoints": [1,2,3,4],
        "Name": "Marge Simpson",
        "Date": "2016-04-05T11:42:09.9126748+01:00"
    },
    {
        "EmployeeId": 3,
        "Skillssetpoints": [1,2,3,4],
        "Name": "Lisa Simpson",
        "Date": "2016-04-05T11:42:09.9126748+01:00"
    },
    {
        "EmployeeId": 4,
        "Skillssetpoints": [1,2,3,4],
        "Name": "Bart Simpson",
        "Date": "2016-04-05T11:42:09.9126748+01:00"
    }
]

【讨论】:

  • 请查看我的问题,因为使用您的解决方案会给我这样的输出:[{},{}]
【解决方案2】:

使用牛顿 JSON,它在 NuGet 上可用,代码非常简单。

using Newtonsoft.Json;

var jsonList = JsonConvert.SerializeObject(context.Employee.Tolist());

干杯

【讨论】:

    【解决方案3】:

    通过对特定字段进行分组来选择所需的记录,然后以所需的模式准备匿名对象并将其序列化以获得最终结果,

            var models = (from em in employeeModels
                          group em by em.ID into g
                          select new
                          {
                              Id = g.Key,
                              maxDate = g.Max(p => p.Date)
                          }).ToList();
            var result = new
            {
                date = prices.Max(p => p.maxDate),
                SkillssetPoints = prices.Select(p => p.Id).ToList()
            };
    
            var json = JsonConvert.SerializeObject(result);
    

    你会得到像这样的模式的json

    {
        "date": "2016-04-05T16:39:54.8420979+05:30",
        "SkillssetPoints": [
            1,
            2,
            3
        ]
    }
    

    【讨论】:

      【解决方案4】:

      使用 Nuget 包中的 Newton JSON 并尝试此代码

      List lstEmp = new List();

              for (int i = 1; i <= 4; i++)
              {
                  Employee emp = new Employee();
                  emp.EmployeeId = i;
                  emp.Name = "Name" + i;
                  emp.Skillssetpoints = i + 1;
                  emp.Date = DateTime.Now.AddDays(i);
                  lstEmp.Add(emp);
              }
      
              var data = lstEmp;
              var result = new EmployeeModel
              {
                  Date = data.Max(p => p.Date),
                  Skillssetpoints = data.Select(p => p.Skillssetpoints).ToList()
              };
      
              var JsonData = JsonConvert.SerializeObject(new
              {
                  Date = result.Date,
                  Skillssetpoints = result.Skillssetpoints
              });
      

      干杯

      【讨论】:

        【解决方案5】:

        1) 使用 NuGet 安装 Newtonsoft.Json 包

        2) 在顶部添加命名空间

         using Newtonsoft.Json;
        

        3) 在您不想包含在 json 转换中的 Model 类属性之上添加 [JsonIgnore]

         public class Employee
        {
            public int EmployeeId { get; set; }
            public int Skillssetpoints { get; set; }
            public string Name { get; set; }
            public Nullable<System.DateTime> Date { get; set; }
        }
        
        public class EmployeeModel
        {
            [JsonIgnore]
            public int EmployeeId { get; set; }
            public List<int> Skillssetpoints { get; set; }
            [JsonIgnore]
            public string Name { get; set; }
            public Nullable<System.DateTime> Date { get; set; }
        }
        

        4) 最终代码如下

        var data = new List<Employee>();
                data.Add(new Employee { EmployeeId = 1, Skillssetpoints = 10, Date = Convert.ToDateTime("4/5/2016 16:12:12") });
                data.Add(new Employee { EmployeeId = 2, Skillssetpoints = 12, Date = Convert.ToDateTime("3/5/2016 17:12:12") });
                data.Add(new Employee { EmployeeId = 3, Skillssetpoints = 4, Date = Convert.ToDateTime("8/5/2016 8:12:12") });
                data.Add(new Employee { EmployeeId = 4, Skillssetpoints = 20, Date = Convert.ToDateTime("1/5/2016 2:12:12") });
        
                var highestDate = data.OrderByDescending(e => e.Date).First().Date;
                var skillssetpointsList = data.Select(e => e.Skillssetpoints).ToList();
        
        
                EmployeeModel employeeModel = new EmployeeModel()
                {
                    Date = highestDate,
                    Skillssetpoints = skillssetpointsList
                };
        
                string jsonString = JsonConvert.SerializeObject(employeeModel);
        

        现在,jsonString = {"Skillssetpoints":[10,12,4,20],"Date":"2016-05-08T08:12:12"}

        【讨论】:

          【解决方案6】:

          您可以尝试创建一个新对象并序列化如下:

          var result = JsonConvert.Serialize (new {
              Date = context.Employee.Max(e => e.Date),
              SkillssetPoints = context.Employee.Select(e => e.SkillssetPoints)
          }));
          

          【讨论】:

            【解决方案7】:

            我想你可以试试这个 它适用于我。

            public ActionResult GetCitiesWithBranches(int regionID)
                {
                    var cities =
                        _context.Cities.Where(e => e.RegionCode == regionID)
                            .Select(e => new { ID = e.CityCode, Name = e.Name })
                            .ToList();
                    return Json(new { cities = cities });
                }
            

            在我看来,我正在使用它:

            var json = { regionID: data };
            $.ajax({
                        type: "POST",
                        url: '@Url.Action("GetCitiesWithBranches", "Admin")',
                        data: json,
                        dataType: "json",
                        error: function (xhr, status, error) {
                            //alert("error routine");
                        },
                        success: function (res) {                    
                            if (res.cities) {
            
                            }
                        }
                    });
            

            希望这会有所帮助..

            【讨论】:

            • 这在 Web api 控制器中是否有效:Json(new { city = cities });
            • 我没有在web api控制器中尝试过。
            猜你喜欢
            • 1970-01-01
            • 2021-07-07
            • 2019-03-23
            • 2021-10-13
            • 2011-11-16
            • 2020-10-19
            • 1970-01-01
            • 2015-08-02
            • 1970-01-01
            相关资源
            最近更新 更多