使用LINQ创建JSON数组

本文关键字:数组 JSON 创建 LINQ 使用 | 更新日期: 2024-09-27 03:37:21

我有一个从数据库返回的对象列表,当使用JSON.NET:进行序列化时,这些对象看起来像这样

"[{"Percentage":0.78, "PartCode":"D40", "InspectionCode":"292", "Make":"TOYOTA"}]
{"Percentage":0.18, "PartCode":"6N", "InspectionCode":"292", "Make":"GM"},
{"Percentage":0.57, "PartCode":"6N", "InspectionCode":"F", "Make":"GM"},
{"Percentage":0.49, "PartCode":"D40", "InspectionCode":"F", "Make":"TOYOTA"},
{"Percentage":0.09, "PartCode":"785", "InspectionCode":"KB", "Make":"CHRYSLER"},
{"Percentage":0.09, "PartCode":"705", "InspectionCode":"KB", "Make":"FORD"},
{"Percentage":0.18, "PartCode":"D40", "InspectionCode":"KB", "Make":"TOYOTA"},
{"Percentage":0.61, "PartCode":"D40", "InspectionCode":"KB", "Make":"TOYOTA"},
{"Percentage":0.39, "PartCode":"705", "InspectionCode":"SB", "Make":"FORD"},
{"Percentage":0.31, "PartCode":"6N", "InspectionCode":"SB", "Make":"GM"},
{"Percentage":0.21, "PartCode":"AW7", "InspectionCode":"XE1", "Make":"CHRYSLER"},
{"Percentage":0.27, "PartCode":"705", "InspectionCode":"XE1", "Make":"FORD"},
{"Percentage":0.28, "PartCode":"UX", "InspectionCode":"XE1", "Make":"FORD"},
{"Percentage":0.56, "PartCode":"D40", "InspectionCode":"XE1", "Make":"TOYOTA"}]"

我需要用这种格式创建两个JSON数组来传递给HighCharts:

var categories = [
{name: "Toyota", categories: ['D40']},
{name: "GM", categories: ['6N']},
{name: "FORD", categories: ['705', 'UX']},
{name: "CHRYSLER", categories: ['AW7','785']}];
var series = [
{name: "292", data = [0.78, 0.18]}
{name: "F", data = [0.57, 0.49]},
{name: "KB", data = [0.09, 0.09, 0.18, 0.61]},
{name: "SB", data = [0.39, 0.31]},
{name: "XE1", data = [0.21, 0.27, 0.28, 0.56]}];

到目前为止,我正在对数据进行嵌套分组,因为Make和PartCode是分层数据。

var query = from d in sortedData
            group d by d.Make into newgroup1
            from newgroup2 in
                (from e in newgroup1
                 group e by e.PartCode)
            group newgroup2 by newgroup1.Key;

我可以使用查看分层格式的数据

foreach (var outergroup in query)
{
    System.Diagnostics.Debug.WriteLine(outergroup.Key);
    foreach (var innergroup in outergroup)
    {
        System.Diagnostics.Debug.WriteLine(innergroup.Key);
        foreach (var innerGroupElement in innergroup)
        {
            System.Diagnostics.Debug.WriteLine("'t't{0} {1}", innerGroupElement.InspectionCode, innerGroupElement.Percentage);
        }
    }
}

但是,我很难理解如何进一步获得所需的JSON数组。为了实现这一目标,我还需要采取哪些步骤?

使用LINQ创建JSON数组

这将得到您想要的。根据Make或InspectionCode进行分组后,该子列表中的所有项目都将包含您要查找的数据。

var categories = sortedData.GroupBy(d => d.Make)
                           .Select(g => new 
                           { 
                               name = g.Key, 
                               categories = g.Select(x => x.PartCode).ToArray() 
                           });
var series = sortedData.GroupBy(d => d.InspectionCode)
                       .Select(g => new 
                       { 
                           name = g.Key, 
                           data = g.Select(x => x.Percentage).ToArray() 
                       });
var categoriesAsJson = Newtonsoft.Json.JsonConvert.SerializeObject(categories);
var seriesAsJson = Newtonsoft.Json.JsonConvert.SerializeObject(series);

如果您的内存中已经有数据,那么使用Json.NET将其转换为Json就像最后两行一样简单。如果您通过WebAPI端点通过网络发送数据,那么您只需让端点返回一个列表,该列表将是类别或系列列表对象,而无需将它们转换为Json。

[HttpGet]
public HttpResponseMessage GetCategories()
{
    var categories = GetCategoriesUsingAboveCode();
    return Request.CreateResponse(HttpStatusCode.OK, categories);
}

类似的东西?

            var categories = sortedData
                .GroupBy(i => i.Make)
                .Select(g => new
                {
                    name = g.Key,
                    categories = sortedData
                        .Where(i2 => i2.Make == g.Key)
                        .Select(i2 => i2.InspectionCode)
                });