.NET 6.0中使用Dapper从Oracle取数后返回多对象JSON的问题
解决方案
首先要修正你目标JSON的格式问题:fiche_avocats字段应该是单个数组包含所有对象,而不是多个独立数组,正确的结构如下:
{ "metadata": [ { "totalResult": "2", "timestamp": "1673347991" } ], "fiche_avocats": [ { "nom": "doe", "pre": "john" }, { "nom": "foo", "pre": "bar" } ] }
要实现这个结构,最直接可靠的方式是创建强类型实体类,ASP.NET Core会自动将其序列化为符合要求的JSON,比Tuple灵活得多。
1. 创建实体类
在你的项目中添加以下类:
// 对应metadata里的单个项 public class MetadataItem { public string totalResult { get; set; } public string timestamp { get; set; } } // 对应单个律师信息 public class AvocatFiche { public string nom { get; set; } public string pre { get; set; } } // 根响应对象 public class AvocatResponse { public List<MetadataItem> metadata { get; set; } public List<AvocatFiche> fiche_avocats { get; set; } }
2. 修改控制器代码
调整GetDatas方法,构造上述实体类并返回:
[HttpGet] [Route("api/GetDatas")] public IActionResult GetDatas(string? nom = null, string? pre = null) { var queryResult = userRepository.GetDatas(nom, pre); var totalResult = userRepository.GetDatasFullQueryResult(nom, pre); int timeStamp = (int)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds; if (queryResult == null) { return NotFound(Tools.returnError("erreur lors de la récuperation des flux avocats, endpoint: api/GetDatas")); } // 构造响应对象 var response = new AvocatResponse { metadata = new List<MetadataItem> { new MetadataItem { totalResult = totalResult.ToString(), // 转成字符串匹配目标格式 timestamp = timeStamp.ToString() } }, fiche_avocats = queryResult.Cast<AvocatFiche>().ToList() // 如果userRepository.GetDatas返回的已经是List<AvocatFiche>,直接赋值即可: // fiche_avocats = queryResult }; return Ok(response); }
说明
- 强类型实体类能保证序列化后的JSON结构完全符合预期,避免Tuple带来的格式不可控问题
- 如果
userRepository.GetDatas返回的类型不是List<AvocatFiche>,需要确保查询结果的字段名和AvocatFiche的属性名一致(Dapper会自动映射),或者通过Dapper的别名查询来匹配
内容的提问来源于stack exchange,提问作者Thery
相关产品推荐
相关产品推荐

