Dapper不直接返回JSON字符串,而是将数据库结果映射为.NET对象,需借助System.Text.Json或Newtonsoft.Json手动序列化;常用做法是先Query<T>()查询再Serialize(),也可用SQL Server的FOR JSON(不推荐),或封装扩展方法。

Dapper 本身不直接返回 JSON 字符串,它是一个轻量级的 ORM,只负责把数据库结果映射为 .NET 对象(如 List<T>、T 等)。要得到 JSON 字符串,你需要在 Dapper 查询之后,用 System.Text.Json 或 Newtonsoft.Json 手动序列化。
1. 先用 Dapper 查询数据,再序列化为 JSON
这是最常用、最清晰的做法。Dapper 负责“取数据”,JSON 库负责“转格式”。
- 使用
Query<T>()获取对象列表或单个对象 - 用
JsonSerializer.Serialize()(.NET Core 3.0+)转成字符串 - 注意:确保实体类属性是 public,且有 getter,否则序列化可能为空
示例(ASP.NET Core Web API 中常见写法):
// 定义模型
public class User { public int Id { get; set; } public string Name { get; set; } }
<p>// Dapper 查询 + JSON 序列化
using var conn = new SqlConnection(connectionString);
var users = conn.Query<User>("SELECT Id, Name FROM Users WHERE Age > @age", new { age = 18 });
string json = JsonSerializer.Serialize(users); // → [{"Id":1,"Name":"张三"}, ...]
2. 不推荐:在 SQL 中拼 JSON(如 FOR JSON)
SQL Server 2016+ 支持 FOR JSON AUTO 或 FOR JSON PATH,可让数据库直接返回 JSON 字符串:
- 执行后得到的是
string类型结果,不是对象,Dapper 只需QuerySingle<string>() - 优点:减少网络传输对象数量,适合简单场景
- 缺点:失去类型安全、难调试、无法复用实体逻辑、跨数据库不兼容
示例:
string json = conn.QuerySingle<string>(@"
SELECT Id, Name FROM Users WHERE Id = @id
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER", new { id = 1 });
// → {"Id":1,"Name":"张三"}
3. 封装成通用方法(可选)
如果项目中频繁需要“查完立刻转 JSON”,可以封装一个扩展方法:
public static class DapperJsonExtensions
{
public static string QueryAsJson<T>(this IDbConnection conn, string sql, object param = null)
{
var result = conn.Query<T>(sql, param);
return JsonSerializer.Serialize(result);
}
}
// 使用:string json = conn.QueryAsJson<User>("SELECT * FROM Users");
基本上就这些。Dapper 的设计哲学就是专注数据映射,不掺杂序列化逻辑——这样更可控、更易测试、也更符合分层职责。










