You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将List<MyModel>转换为Google API DataTable?

问题:如何将List转换为Google Charts API的DataTable格式?

当前Ajax可成功调用GetData()获取数据,但返回的List<MyModel>格式和Google Charts要求不匹配,导致图表无法正常渲染。

Google Charts API要求的数据格式示例

var data = new google.visualization.DataTable();
data.addColumn('string', 'First_name');
data.addColumn('string', 'Salary');
data.addColumn('boolean', 'Full_Time_Employee');
data.addRows([
    ['Mike', '$10,000', true],
    ['Jim', '$8,000', false],
    ['Alice', '$12,500', true],
    ['Bob', '$7,000', true]
]);

后端返回的JSON结构(单条数据示例)

{ First_Name = "Mike", Salary= "10000",  Full_Time_Employee = true }

现有控制器代码

public async Task<IActionResult> GetData()
{
    try
    {
        // query data  
        IQueryable<MyModel> query = (IQueryable<MyModel>)(from x in _context1.CourseTaken_DbSet
                                               select x);
        //load data
        List<MyModel> graphData = await query.AsNoTracking().Take(100).ToListAsync();
        // return json data to google charts api
        return Json(graphData);
    }
    catch (Exception ex)
    {
        Console.Write(ex);
    }
    return View();
}

现有前端关键代码

$.ajax({
    type: "POST",
    url: "/Home/GetData",
    data: '{}',
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (r) {
        alert("sucess" + r.d);
        var data = new google.visualization.arrayToDataTable(r.d);
        var chart = new google.visualization.Table($("#Chart01Div")[0]);
        chart.draw(data, options);
    },
    failure: function (r) {
        alert("Failure: " + r.d);
    },
    error: function (r) {
        alert("Error: " + r.d);
    }
});

尝试修改前端回调后,弹出内容为[object Object],[object Object],...,仍无法正常显示。


解决方案

方案1:后端直接返回符合要求的格式

在后端把List<MyModel>转换成Google Charts需要的二维数组结构,前端可直接解析:

修改后的控制器代码:

public async Task<IActionResult> GetData()
{
    try
    {
        var query = from x in _context1.CourseTaken_DbSet
                    select x;
        List<MyModel> graphData = await query.AsNoTracking().Take(100).ToListAsync();

        // 构建Google Charts需要的二维数组:首行是表头,后续是数据行
        var googleData = new List<List<object>>();
        // 添加表头
        googleData.Add(new List<object> { "First_name", "Salary", "Full_Time_Employee" });
        // 添加数据行,同时格式化Salary为带$和千分位的格式
        foreach (var item in graphData)
        {
            var formattedSalary = $"${int.Parse(item.Salary):N0}";
            googleData.Add(new List<object> { item.First_Name, formattedSalary, item.Full_Time_Employee });
        }

        return Json(googleData);
    }
    catch (Exception ex)
    {
        Console.Write(ex);
        return StatusCode(500, "获取数据失败");
    }
}

对应的前端success回调修改:

success: function (r) {
    var data = new google.visualization.arrayToDataTable(r);
    var chart = new google.visualization.Table($("#Chart01Div")[0]);
    chart.draw(data, options);
},

方案2:前端处理对象数组转换格式

如果不想改动后端,可在前端把返回的对象数组转换成Google Charts需要的结构:

修改后的前端success回调:

success: function (r) {
    if (r.length === 0) return;

    // 初始化DataTable实例
    var data = new google.visualization.DataTable();
    // 添加列定义
    data.addColumn('string', 'First_name');
    data.addColumn('string', 'Salary');
    data.addColumn('boolean', 'Full_Time_Employee');

    // 将对象数组转换为数据行
    var rows = r.map(item => {
        // 格式化Salary为带$和千分位的字符串
        var formattedSalary = "$" + parseInt(item.Salary).toLocaleString();
        return [item.First_Name, formattedSalary, item.Full_Time_Employee];
    });

    data.addRows(rows);
    var chart = new google.visualization.Table($("#Chart01Div")[0]);
    chart.draw(data, options);
},

额外优化:更新Google Charts加载方式

当前代码使用的google.load已不推荐,建议替换为最新的加载方式:

google.charts.load("current", { packages: ["table"] });
google.charts.setOnLoadCallback(drawChart01);

内容的提问来源于stack exchange,提问作者dave

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 23:55:29