首页 > 解决方案 > 谷歌图表的多系列 JSON 数据

问题描述

我正在尝试创建一个 JSON 提要以向 Google 图表返回一个包含四个系列的多折线图。我正在努力形成正确的 JSON 以返回图表。

我正在使用一个存储过程,它会生成一长串我需要在图表中显示的数据。我希望能够获取一长串数据并将其转换为四个单独的数据系列并以 JSON 格式发送回图表。

我的模型:

public class FoodCountCompare
{
    [JsonProperty("Count")]
    public int Count { get; set; }
    [JsonProperty("Day")]
    public string Day { get; set; }
    [JsonProperty("Type")]
    public string Type { get; set; }       
}

我的 SPROC:

    SELECT COUNT(P) AS 'Count', DATENAME(DW, fldTimeStamp) AS 'Day', @P AS 'Type' FROM [dbname].[FoodTypes] WHERE Protein = 1 AND fldUserId = ''+ @UserId+'' GROUP BY DATENAME(DW, fldTimeStamp)
    UNION ALL
    SELECT COUNT(H) AS 'Count', DATENAME(DW, fldTimeStamp) AS 'Day', @H AS 'Type' FROM [dbname].[FoodTypes]WHERE HEC = 1 AND fldUserId = ''+ @UserId+'' GROUP BY DATENAME(DW, fldTimeStamp)
    UNION ALL
    SELECT COUNT(L) AS 'Count', DATENAME(DW, fldTimeStamp) AS 'Day', @L AS 'Type' FROM [dbname].[FoodTypes]WHERE LEC = 1 AND fldUserId = ''+ @UserId+'' GROUP BY DATENAME(DW, fldTimeStamp)
    UNION ALL
    SELECT COUNT(O) AS 'Count', DATENAME(DW, fldTimeStamp) AS 'Day', @F AS 'Type' FROM [dbname].[FoodTypes]WHERE OmegaFA = 1 AND fldUserId = ''+ @UserId+'' GROUP BY DATENAME(DW, fldTimeStamp)

然后在我的 C# 代码中创建四个单独的列表,我确信这是错误的。每个列表都包含正确的数据,因此这部分有效。我尝试过使用数组和序列化,但我被困在如何更进一步。

[Function(Name = "[dbname].[FoodCountCompare]")]
public List<FoodCountCompare> GetFoodCountCompare(){
        string UserId = User.Identity.GetUserId();
        var dc = new DataClasses1DataContext();
        var x = dc.FoodCountCompare(UserId).ToList();            

        var Protein = (from a in x where a.Type == "P" select new { a.Count, a.Day, a.Type }).ToList();
        var HEC = (from a in x where a.Type == "H" select new { a.Count, a.Day, a.Type }).ToList();
        var LEC = (from a in x where a.Type == "L" select new { a.Count, a.Day, a.Type }).ToList();
        var F = (from a in x where a.Type == "O" select new { a.Count, a.Day, a.Type }).ToList(); 

        //Add code to create JSON here
        JavaScriptSerializer js = new JavaScriptSerializer();
        string p = js.Serialize(Protein);
        string h = js.Serialize(HEC);
        string l = js.Serialize(LEC);
        string f = js.Serialize(F);

        return something_like_json;
    }

public JsonResult FoodCountCompare(){       
        var items = new List<FoodCountCompare>(GetFoodCountCompare());
        return Json(items, JsonRequestBehavior.AllowGet);
    }

对我来说,问题是,您如何获取这些数据并将其转换为 JSON,例如嵌套数组或直接数据集。

标签: c#jsongoogle-visualization

解决方案


你的意思是这样的:

[Function(Name = "[dbname].[FoodCountCompare]")]
public List<FoodCountCompare> GetFoodCountCompare(){
    string UserId = User.Identity.GetUserId();
    var dc = new DataClasses1DataContext();
    var x = dc.FoodCountCompare(UserId).ToList();
    var items = x.Select(d => new FoodCountCompare { Type = d.Type, Day = d.Day, Count = d.Count }) 
    return items;
}

public JsonResult FoodCountCompare(){       
    var items = new List<FoodCountCompare>(GetFoodCountCompare());
    return Json(new {
        Protein = items.Where(d => d.Type == "P"),
        Hec = items.Where(d => d.Type == "H"),
        Lec = items.Where(d => d.Type == "L"),
        F = items.Where(d => d.Type == "O"),
    }, JsonRequestBehavior.AllowGet);
}

这将导致每种类型有 4 个不同的数组:

{"Protein":[ ... ],"Hec":[ ... ], "Lec":[ ... ], "F":[ ... ]}

我相信您不需要指定确切的 json 属性名称。


推荐阅读