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

如何将DataTable序列化为JSON格式?现有代码存问题求指导

问题分析与解决方案

原代码的几个错误点

  • 变量名不一致:定义了dt但填充的是未声明的objDT,编译会报错
  • 序列化逻辑搞反:JsonSerializer.Deserialize是把JSON转成对象,你要的是把DataTable转成JSON,应该用JsonSerializer.Serialize
  • 方法标记了async但没有异步操作,属于无效标记
  • 返回类型是Task<DataTable>,但你要返回JSON的话类型不匹配

方案1:直接返回JSON字符串(调整方法返回类型)

如果你的目标是返回DataTable对应的JSON格式字符串,修改代码如下:

public string GetFlightSearchList()
{
    string ConStr = _configuration["Data:Flyraja:DbConnectionString"].ToString();
    using (SqlConnection con = new SqlConnection(ConStr))
    {
        DataTable dt = new DataTable();
        using (SqlDataAdapter adap = new SqlDataAdapter("SELECT * FROM FlightSearchResults", con))
        {
            adap.Fill(dt);
        }
        // 将DataTable序列化为JSON字符串
        return JsonSerializer.Serialize(dt);
    }
}

如果要改成异步版本(推荐,避免阻塞线程):

public async Task<string> GetFlightSearchList()
{
    string ConStr = _configuration["Data:Flyraja:DbConnectionString"].ToString();
    using (SqlConnection con = new SqlConnection(ConStr))
    {
        await con.OpenAsync();
        DataTable dt = new DataTable();
        using (SqlCommand cmd = new SqlCommand("SELECT * FROM FlightSearchResults", con))
        using (SqlDataReader reader = await cmd.ExecuteReaderAsync())
        {
            dt.Load(reader);
        }
        return JsonSerializer.Serialize(dt);
    }
}

方案2:返回可自动序列化的对象列表(推荐)

直接返回DataTable在部分框架中序列化可能有兼容性问题,建议转换成强类型实体类或动态对象列表:

  1. 先定义FlightSearchResult实体类(根据数据库表字段调整):
public class FlightSearchResult
{
    // 示例字段,替换成你表中的实际字段
    public int Id { get; set; }
    public string FlightNumber { get; set; }
    public DateTime DepartureTime { get; set; }
    // 其他字段...
}
  1. 修改方法返回实体列表:
public async Task<List<FlightSearchResult>> GetFlightSearchList()
{
    string ConStr = _configuration["Data:Flyraja:DbConnectionString"].ToString();
    List<FlightSearchResult> results = new List<FlightSearchResult>();
    
    using (SqlConnection con = new SqlConnection(ConStr))
    {
        await con.OpenAsync();
        using (SqlCommand cmd = new SqlCommand("SELECT * FROM FlightSearchResults", con))
        using (SqlDataReader reader = await cmd.ExecuteReaderAsync())
        {
            while (await reader.ReadAsync())
            {
                results.Add(new FlightSearchResult
                {
                    Id = reader.GetInt32(reader.GetOrdinal("Id")),
                    FlightNumber = reader.GetString(reader.GetOrdinal("FlightNumber")),
                    DepartureTime = reader.GetDateTime(reader.GetOrdinal("DepartureTime")),
                    // 映射其他字段...
                });
            }
        }
    }
    // 框架会自动将List序列化为JSON返回(比如ASP.NET Core中)
    return results;
}

补充说明

  • 使用using语句包裹数据库连接、命令等对象,确保资源自动释放
  • 如果是在ASP.NET Core控制器中,直接返回Ok(results)或Ok(jsonString)即可,框架会处理HTTP响应格式
  • 若必须返回DataTable并让框架自动序列化,ASP.NET Core默认的System.Text.Json对DataTable的支持需要配置,可在Program.cs中添加:
builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.Converters.Add(new DataTableConverter());
    });

(需要引用System.Text.Json.Serialization命名空间)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 08:40:25