Dapper如何处理JSON数据 Dapper查询SQL Server JSON列

来源:这里教程网 时间:2026-02-21 17:34:56 作者:

Dapper本身不直接解析SQL Server的JSON列,但它可以配合SQL Server内置的JSON函数,把JSON数据作为字符串读取,再用.NET的JSON库(如System.Text.Json或Newtonsoft.Json)反序列化为对象。

将JSON列作为字符串读取

SQL Server中定义为

NVARCHAR(MAX)
的JSON列,在Dapper查询时默认按字符串返回。只要字段类型匹配,Dapper会自动映射为
string

确保SQL查询中明确选择该列(如
SELECT Id, Metadata FROM Products
Dapper不会主动解析内容,只做类型映射;
Metadata
字段在C#实体中应声明为
string
若用匿名类型或
IDictionary<string object></string>
接收,值仍是原始JSON字符串

用SQL Server JSON函数预处理再映射

利用

JSON_VALUE
JSON_QUERY
等函数在数据库层提取结构化字段,让Dapper直接映射为C#原生类型:

SELECT Id, JSON_VALUE(Metadata, '$.Name') AS Name, JSON_VALUE(Metadata, '$.Price') AS Price FROM Products
对应C#类中可定义
public string Name { get; set; }
public decimal? Price { get; set; }
适合常用、固定路径的JSON字段,减少应用层解析开销

在C#中反序列化JSON字符串

拿到JSON字符串后,用

System.Text.Json.JsonSerializer.Deserialize<t>()</t>
JsonConvert.DeserializeObject<t>()</t>
转成强类型对象:

推荐使用
System.Text.Json
(.NET Core 3.0+ 默认):简洁高效,支持
JsonSerializerOptions
控制大小写、忽略空值等
若JSON结构复杂或含动态键,可用
JsonDocument.Parse()
JsonElement
按需访问
注意异常处理:JSON格式错误、类型不匹配会抛出
JsonException
,建议包裹在
try-catch

批量查询与性能提示

对大量含JSON列的数据操作,要注意效率和内存:

避免在WHERE中直接用
JSON_VALUE
做条件筛选(无法走索引),优先考虑冗余计算列+索引
若只需部分字段,尽量用
JSON_VALUE
在SQL层提取,而非拉取整段JSON再解析
使用
QueryAsync<t></t>
配合流式处理(如
foreach await
)降低内存压力

基本上就这些。Dapper保持轻量,JSON处理交给SQL Server函数或.NET生态,组合起来既灵活又可控。

相关推荐