如何在反序列化为dynamic的JSON数组中匹配路径并获取对应BoxId?
问题
前端将序列化后的JSON数组发送至后端,用于批量导入BoxId到数据库(通过文件路径匹配关联)。前端传来的JSON数据格式如下:
[{"File Type" : "Folder", "File Id" : "dfasf23r", "File Path" : "/dir/test/filename.docx"}, ...]
后端使用以下代码反序列化并处理,但不知道如何在JSON变量中搜索匹配项并获取对应BoxId:
public async Task<IActionResult> BoxIdsImport([FromForm] string jsonData) { dynamic json = JsonSerializer.Deserialize<dynamic>(jsonData); String query = "select FILE_ID, (DOCUMENT_PATH + DOCUMENT_FILENAME) as FULL_PATH, BoxID from dbo.DocumentTBL"; using (var connection = new SqlConnection(connectionStringSandbox)) { var queryResult = await connection.QueryAsync(query); foreach(var item in queryResult) { //此处需在JSON数据中匹配对应的文件路径,获取关联的BoxId并更新至数据库记录 if(item.FULL_PATH == matched value) { item.BoxID = the associated box id for the matched record } } } return Ok(); }
解决方案
1. 定义强类型实体类替代dynamic
用强类型实体类接收反序列化的JSON,比dynamic更安全、易维护,还能避免类型匹配错误:
public class BoxFileDto { [JsonPropertyName("File Type")] public string FileType { get; set; } [JsonPropertyName("File Id")] public string FileId { get; set; } // 对应JSON中的BoxId [JsonPropertyName("File Path")] public string FilePath { get; set; } }
2. 反序列化并构建路径映射字典
将JSON反序列化为实体列表,再构建以文件路径为键、BoxId为值的字典,这样匹配时的时间复杂度为O(1),大幅提升批量处理效率:
// 替换原dynamic反序列化代码 var boxFiles = JsonSerializer.Deserialize<List<BoxFileDto>>(jsonData); if (boxFiles == null || !boxFiles.Any()) { return BadRequest("无效的JSON数据"); } var pathToBoxIdMap = boxFiles.ToDictionary(f => f.FilePath, f => f.FileId);
3. 匹配路径并收集待更新数据
遍历数据库查询结果,通过字典快速匹配文件路径,收集需要更新的记录(注意:直接修改内存中的item.BoxID不会同步到数据库,必须执行UPDATE语句):
var updateList = new List<(int FileId, string BoxId)>(); foreach(var item in queryResult) { if(pathToBoxIdMap.TryGetValue(item.FULL_PATH, out var boxId)) { updateList.Add((item.FILE_ID, boxId)); } }
4. 批量更新数据库
使用Dapper的批量执行能力,一次性更新所有匹配的记录,减少数据库交互次数:
if(updateList.Any()) { var updateQuery = @" UPDATE dbo.DocumentTBL SET BoxID = @BoxId WHERE FILE_ID = @FileId"; await connection.ExecuteAsync(updateQuery, updateList); }
完整修改后的代码
public class BoxFileDto { [JsonPropertyName("File Type")] public string FileType { get; set; } [JsonPropertyName("File Id")] public string FileId { get; set; } [JsonPropertyName("File Path")] public string FilePath { get; set; } } public async Task<IActionResult> BoxIdsImport([FromForm] string jsonData) { var boxFiles = JsonSerializer.Deserialize<List<BoxFileDto>>(jsonData); if(boxFiles == null || !boxFiles.Any()) { return BadRequest("无效的JSON数据"); } var pathToBoxIdMap = boxFiles.ToDictionary(f => f.FilePath, f => f.FileId); String query = "select FILE_ID, (DOCUMENT_PATH + DOCUMENT_FILENAME) as FULL_PATH from dbo.DocumentTBL"; using (var connection = new SqlConnection(connectionStringSandbox)) { var queryResult = await connection.QueryAsync(query); var updateList = new List<(int FileId, string BoxId)>(); foreach(var item in queryResult) { if(pathToBoxIdMap.TryGetValue(item.FULL_PATH, out var boxId)) { updateList.Add((item.FILE_ID, boxId)); } } if(updateList.Any()) { var updateQuery = @" UPDATE dbo.DocumentTBL SET BoxID = @BoxId WHERE FILE_ID = @FileId"; await connection.ExecuteAsync(updateQuery, updateList); } } return Ok("批量更新完成"); }
内容的提问来源于stack exchange,提问作者Qiuzman
相关产品推荐
相关产品推荐

