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

ASP.NET Core中Dapper映射SQL Server JSON列到C#类及报错排查

问题分析与解决方案

错误原因

你遇到的核心问题有两个:

  1. 类型不匹配:你试图把反序列化得到的ClientModel实例赋值给ClientModel.data属性(该属性类型是Data),两者类型完全不同,因此触发转换错误。
  2. 模型属性访问性缺失:你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 16:47:08