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

调用API填充ASP.NET GridView遇序列化问题求助

解决ASP.NET WebForm中API数据填充表格的序列化问题

你代码里的核心问题是重复序列化API返回的JSON,而且没有正确解析出data数组里的实际数据,导致整个JSON字符串被当成一条记录塞进表格了。下面是具体的修复方案:

步骤1:创建对应的数据实体类

先定义和API返回结构匹配的实体类,方便反序列化时映射数据:

// API响应的外层结构
public class ApiResponse
{
    public bool success { get; set; }
    public string message { get; set; }
    public List<Document> data { get; set; }
}

// 单个文档的数据结构
public class Document
{
    public string A1 { get; set; }
    public string A2 { get; set; }
    public string file_name { get; set; }
    public string file_type { get; set; }
    public DateTime created_datetime { get; set; }
    public string created_by { get; set; }
    public bool active { get; set; }
    public string updated_by { get; set; }
    public DateTime? updated_datetime { get; set; }
}

步骤2:修正API调用与反序列化代码

把你的BindGridView1方法改成这样,重点解决序列化错误和数据提取问题:

private async void BindGridView1()
{
    string apiUrl = "http://mesappbeta/BE_API_HOME/api/SeriesBlacklist/Req_UploadedDocs?series=AE01400&series_type=RU";
    using (var client = new HttpClient())
    {
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        HttpResponseMessage response = await client.GetAsync(apiUrl); // 用await替代.Result,避免阻塞死锁
        if (response.IsSuccessStatusCode)
        {
            // 直接读取API返回的JSON字符串,不要重复序列化
            string json = await response.Content.ReadAsStringAsync();
            // 反序列化为强类型对象,直接获取data数组
            var apiResponse = JsonConvert.DeserializeObject<ApiResponse>(json);
            
            DataTable dt = new DataTable();
            dt.Columns.Add("file_name");
            dt.Columns.Add("file_type");
            dt.Columns.Add("created_datetime");

            // 遍历data数组里的每个文档,提取需要的字段填入DataTable
            foreach(var doc in apiResponse.data)
            {
                dt.Rows.Add(doc.file_name, doc.file_type, doc.created_datetime.ToString("yyyy-MM-dd HH:mm:ss"));
            }
            GridView2.DataSource = dt;
            GridView2.DataBind();
        }
    }
}

关键修正点说明

  • 移除了JsonConvert.SerializeObject(response.Content.ReadAsStringAsync().Result):API返回的已经是JSON字符串,再次序列化会把它转成带转义符的字符串,自然会被当成单条数据。
  • 使用JsonConvert.DeserializeObject<ApiResponse>(json)解析JSON:把字符串转成强类型对象后,就能直接访问data数组里的每一条文档数据。
  • 替换.Result为await:异步方法里用.Result容易引发死锁,await是更安全的异步调用方式。

额外优化(可选)

如果不想手动构建DataTable,也可以直接把data数组绑定到GridView,只需在前端配置列即可:

<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="false">
    <Columns>
        <asp:BoundField DataField="file_name" HeaderText="文件名" />
        <asp:BoundField DataField="file_type" HeaderText="文件类型" />
        <asp:BoundField DataField="created_datetime" HeaderText="创建时间" DataFormatString="{0:yyyy-MM-dd HH:mm:ss}" />
    </Columns>
</asp:GridView>

然后代码里直接绑定:

GridView2.DataSource = apiResponse.data;
GridView2.DataBind();

这种方式更简洁,省去手动构建DataTable的步骤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 14:06:55