ASP.NET Core中Dapper映射SQL Server JSON列到C#类及报错排查
问题分析与解决方案
错误原因
你遇到的核心问题有两个:
- 类型不匹配:你试图把反序列化得到的
ClientModel实例赋值给ClientModel.data属性(该属性类型是Data),两者类型完全不同,因此触发转换错误。 - 模型属性访问性缺失:你的
Data、Address类中的属性默认是私有访问级别,JSON序列化器无法读取/写入这些私有属性,会导致反序列化后属性值为空;同时ClientModel未定义Id属性,代码中赋值Id会引发编译错误。
修正步骤
1. 调整客户端模型
- 给
ClientModel添加Id属性,用于存储数据库返回的Id值 - 将
Data、Address类中的属性改为public,确保JSON序列化器可以正常访问
// 修正后的客户端模型 public class ClientModel { public int Id { get; set; } public Data data { get; set; } = null; } public class Data { public string name { get; set; } = string.Empty; public string[] aliases { get; set; } = null; public Address address { get; set; } = null; } public class Address { public string main { get; set; } = string.Empty; }
2. 正确的映射代码
数据库返回的JSON结构完全匹配ClientModel(外层是data字段),直接将JSON列反序列化为ClientModel,再补充Id值即可:
// 从数据库查询单条数据(若为多条需循环处理) var dbModel = _sqlConnection.QueryFirst<MyDBModel>(sql); // 反序列化JSON列到ClientModel var clientModel = JsonSerializer.Deserialize<ClientModel>(dbModel.MyJsonColumn); // 赋值数据库中的Id clientModel.Id = dbModel.Id; return clientModel;
3. 额外注意事项
- 确保你的JSON字符串格式正确(你提供的示例JSON中
address的闭合括号写错了,应该是}) - 如果需要自定义反序列化规则,可以给
JsonSerializer.Deserialize传入JsonSerializerOptions参数,比如配置忽略大小写、处理空值等
内容的提问来源于stack exchange,提问作者henhen
相关产品推荐
相关产品推荐

